git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269413 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -0,0 +1,227 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2000 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.Task; | |||||
| import org.apache.tools.ant.taskdefs.*; | |||||
| import org.apache.tools.ant.types.Commandline; | |||||
| import org.apache.tools.ant.types.CommandlineJava; | |||||
| import org.apache.tools.ant.types.Path; | |||||
| import org.apache.tools.ant.types.FileSet; | |||||
| import org.apache.tools.ant.DirectoryScanner; | |||||
| import java.util.Vector; | |||||
| import java.util.Random; | |||||
| import java.io.File; | |||||
| import java.io.FilenameFilter; | |||||
| import java.io.FileWriter; | |||||
| import java.io.PrintWriter; | |||||
| import java.io.IOException; | |||||
| /** | |||||
| * Convenient task to run the snapshot merge utility for JProbe Coverage. | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class CovMerge extends Task { | |||||
| /** coverage home, it is mandatory */ | |||||
| private File home = null; | |||||
| /** the name of the output snapshot */ | |||||
| private File tofile = null; | |||||
| /** the filesets that will get all snapshots to merge */ | |||||
| private Vector filesets = new Vector(); | |||||
| private boolean verbose; | |||||
| /** | |||||
| * set the coverage home. it must point to JProbe coverage | |||||
| * directories where are stored native librairies and jars | |||||
| */ | |||||
| public void setHome(File value) { | |||||
| this.home = value; | |||||
| } | |||||
| /** | |||||
| * Set the output snapshot file | |||||
| */ | |||||
| public void setTofile(File value) { | |||||
| this.tofile = value; | |||||
| } | |||||
| /** run the merging in verbose mode */ | |||||
| public void setVerbose(boolean flag){ | |||||
| this.verbose = flag; | |||||
| } | |||||
| /** add a fileset containing the snapshots to include/exclude */ | |||||
| public void addFileset(FileSet fs){ | |||||
| filesets.addElement(fs); | |||||
| } | |||||
| //---------------- the tedious job begins here | |||||
| public CovMerge() { | |||||
| } | |||||
| /** execute the jpcovmerge by providing a parameter file */ | |||||
| public void execute() throws BuildException { | |||||
| checkOptions(); | |||||
| File paramfile = createParamFile(); | |||||
| try{ | |||||
| Commandline cmdl = new Commandline(); | |||||
| cmdl.setExecutable( new File(home, "jpcovmerge").getAbsolutePath() ); | |||||
| if (verbose) { | |||||
| cmdl.createArgument().setValue("-v"); | |||||
| } | |||||
| cmdl.createArgument().setValue("-jp_paramfile=" + paramfile.getAbsolutePath()); | |||||
| LogStreamHandler handler = new LogStreamHandler(this,Project.MSG_INFO,Project.MSG_WARN); | |||||
| Execute exec = new Execute(handler); | |||||
| log(cmdl.toString(), Project.MSG_VERBOSE); | |||||
| exec.setCommandline(cmdl.getCommandline()); | |||||
| // JProbe process always return 0 so we will not be | |||||
| // able to check for failure ! :-( | |||||
| int exitValue = exec.execute(); | |||||
| if (exitValue!=0) { | |||||
| throw new BuildException("JProbe Coverage Merging failed (" + exitValue + ")"); | |||||
| } | |||||
| } catch (IOException e) { | |||||
| throw new BuildException("Failed to run JProbe Coverage Merge: " + e); | |||||
| } finally { | |||||
| //@todo should be removed once switched to JDK1.2 | |||||
| paramfile.delete(); | |||||
| } | |||||
| } | |||||
| /** check for mandatory options */ | |||||
| protected void checkOptions() throws BuildException { | |||||
| if (tofile == null) { | |||||
| throw new BuildException("'tofile' attribute must be set."); | |||||
| } | |||||
| if (home == null) { | |||||
| throw new BuildException("'home' attribute must be set to JProbe Coverage home directory"); | |||||
| } | |||||
| File jar = new File(home, "coverage.jar"); | |||||
| if (!jar.exists()) { | |||||
| throw new BuildException("'home' attribute is not set to Coverage home directory: " + home); | |||||
| } | |||||
| } | |||||
| /** get the snapshots from the filesets */ | |||||
| protected File[] getSnapshots() { | |||||
| Vector v = new Vector(); | |||||
| final int size = filesets.size(); | |||||
| for (int i = 0; i < size; i++) { | |||||
| FileSet fs = (FileSet) filesets.elementAt(i); | |||||
| DirectoryScanner ds = fs.getDirectoryScanner(getProject()); | |||||
| ds.scan(); | |||||
| String[] f = ds.getIncludedFiles(); | |||||
| for (int j = 0; j < f.length; j++) { | |||||
| String pathname = f[j]; | |||||
| File file = new File(ds.getBasedir(), pathname); | |||||
| file = project.resolveFile(file.getPath()); | |||||
| v.addElement( file ); | |||||
| } | |||||
| } | |||||
| File[] files = new File[v.size()]; | |||||
| v.copyInto(files); | |||||
| return files; | |||||
| } | |||||
| /** | |||||
| * create the parameters file that contains all file to merge | |||||
| * and the output filename. | |||||
| */ | |||||
| protected File createParamFile() throws BuildException { | |||||
| File[] snapshots = getSnapshots(); | |||||
| File file = createTmpFile(); | |||||
| FileWriter fw = null; | |||||
| try { | |||||
| fw = new FileWriter(file); | |||||
| PrintWriter pw = new PrintWriter(fw); | |||||
| for (int i = 0; i < snapshots.length; i++) { | |||||
| pw.println(snapshots[i].getAbsolutePath()); | |||||
| } | |||||
| // last file is the output snapshot | |||||
| pw.println(project.resolveFile(tofile.getPath())); | |||||
| pw.flush(); | |||||
| return file; | |||||
| } catch (IOException e){ | |||||
| if (fw != null) { | |||||
| try { | |||||
| fw.close(); | |||||
| } catch (IOException ignored){ | |||||
| } | |||||
| } | |||||
| throw new BuildException("I/O error while writing to " + file, e); | |||||
| } | |||||
| } | |||||
| /** create a temporary file in the current dir (For JDK1.1 support) */ | |||||
| protected File createTmpFile(){ | |||||
| final long rand = (new Random(System.currentTimeMillis())).nextLong(); | |||||
| File file = new File("jpcovmerge" + rand + ".tmp"); | |||||
| return file; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,386 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2000 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.Task; | |||||
| import org.apache.tools.ant.taskdefs.*; | |||||
| import org.apache.tools.ant.types.Commandline; | |||||
| import org.apache.tools.ant.types.CommandlineJava; | |||||
| import org.apache.tools.ant.types.Path; | |||||
| import org.apache.tools.ant.types.EnumeratedAttribute; | |||||
| import org.apache.tools.ant.types.FileSet; | |||||
| import org.apache.tools.ant.DirectoryScanner; | |||||
| import java.util.Vector; | |||||
| import java.io.File; | |||||
| import java.io.FilenameFilter; | |||||
| import java.io.IOException; | |||||
| import javax.xml.transform.*; | |||||
| import javax.xml.transform.stream.*; | |||||
| import javax.xml.transform.dom.*; | |||||
| import org.w3c.dom.Document; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.*; | |||||
| import java.io.*; | |||||
| /** | |||||
| * Convenient task to run the snapshot merge utility for JProbe Coverage 3.0. | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class CovReport extends Task { | |||||
| /* | |||||
| jpcoverport [options] -output=file -snapshot=snapshot.jpc | |||||
| jpcovreport [options] [-paramfile=file] -output=<fileName> -snapshot=<fileName> | |||||
| Generate a report based on the indicated snapshot | |||||
| -paramfile=file | |||||
| A text file containing the report generation options. | |||||
| -format=(html|text|xml) defaults to html | |||||
| The format of the generated report. | |||||
| -type=(executive|summary|detailed|verydetailed) defaults to detailed | |||||
| The type of report to be generated. For -format=xml, | |||||
| use -type=verydetailed to include source code lines. | |||||
| Note: A very detailed report can be VERY large. | |||||
| -percent=num Min 1 Max 101 Default 101 | |||||
| An integer representing a percentage of coverage. | |||||
| Only methods with test case coverage less than the | |||||
| percentage are included in reports. | |||||
| -filters=string | |||||
| A comma-separated list of filters in the form | |||||
| <package>.<class>:V, where V can be I for Include or | |||||
| E for Exclude. For the default package, omit <package>. | |||||
| -filters_method=string | |||||
| Optional. A comma-separated list of methods that | |||||
| correspond one-to-one with the entries in -filters. | |||||
| -output=string Must be specified | |||||
| The absolute path and file name for the generated | |||||
| report file. | |||||
| -snapshot=string Must be specified | |||||
| The absolute path and file name of the snapshot file. | |||||
| -inc_src_text=(on|off) defaults to on | |||||
| Include text of the source code lines. | |||||
| Only applies for -format=xml and -type=verydetailed. | |||||
| -sourcepath=string defaults to . | |||||
| A semicolon-separated list of source paths. | |||||
| /* | |||||
| /** coverage home, mandatory */ | |||||
| private File home = null; | |||||
| /** format of generated report, optional */ | |||||
| private String format = null; | |||||
| /** the name of the output snapshot, mandatory */ | |||||
| private File tofile = null; | |||||
| /** type of report, optional */ | |||||
| private String type = null; | |||||
| /** threshold value for printing methods, optional */ | |||||
| private Integer percent = null; | |||||
| /** comma separated list of filters (???)*/ | |||||
| private String filters = null; | |||||
| /** name of the snapshot file to create report from */ | |||||
| private File snapshot = null; | |||||
| /** sourcepath to use */ | |||||
| private Path sourcePath = null; | |||||
| /** include the text for each line of code (xml report verydetailed)*/ | |||||
| private boolean includeSource = true; | |||||
| private Path coveragePath = null; | |||||
| /** */ | |||||
| private Reference reference = null; | |||||
| /** | |||||
| * Set the coverage home. it must point to JProbe coverage | |||||
| * directories where are stored native libraries and jars. | |||||
| */ | |||||
| public void setHome(File value) { | |||||
| this.home = value; | |||||
| } | |||||
| public static class ReportFormat extends EnumeratedAttribute { | |||||
| public String[] getValues(){ | |||||
| return new String[]{"html", "text", "xml"}; | |||||
| } | |||||
| } | |||||
| /** set the format of the report html|text|xml*/ | |||||
| public void setFormat(ReportFormat value){ | |||||
| this.format = value.getValue(); | |||||
| } | |||||
| public static class ReportType extends EnumeratedAttribute { | |||||
| public String[] getValues(){ | |||||
| return new String[]{"executive", "summary", "detailed", "verydetailed"}; | |||||
| } | |||||
| } | |||||
| /** sets the report type executive|summary|detailed|verydetailed */ | |||||
| public void setType(ReportType value){ | |||||
| this.type = value.getValue(); | |||||
| } | |||||
| /** include source code lines. XML report only */ | |||||
| public void setIncludesource(boolean value){ | |||||
| this.includeSource = value; | |||||
| } | |||||
| /** sets the threshold printing method 0-100*/ | |||||
| public void setPercent(Integer value){ | |||||
| this.percent = value; | |||||
| } | |||||
| /** set the filters */ | |||||
| public void setFilters(String values){ | |||||
| this.filters = values; | |||||
| } | |||||
| public Path createSourcepath(){ | |||||
| if (sourcePath == null) { | |||||
| sourcePath = new Path(project); | |||||
| } | |||||
| return sourcePath.createPath(); | |||||
| } | |||||
| public void setSnapshot(File value){ | |||||
| this.snapshot = value; | |||||
| } | |||||
| /** | |||||
| * Set the output snapshot file | |||||
| */ | |||||
| public void setTofile(File value) { | |||||
| this.tofile = value; | |||||
| } | |||||
| //@todo to remove | |||||
| public Path createCoveragepath(){ | |||||
| if (coveragePath == null) { | |||||
| coveragePath = new Path(project); | |||||
| } | |||||
| return coveragePath.createPath(); | |||||
| } | |||||
| public Reference createReference(){ | |||||
| if (reference == null){ | |||||
| reference = new Reference(); | |||||
| } | |||||
| return reference; | |||||
| } | |||||
| public CovReport() { | |||||
| } | |||||
| /** check for mandatory options */ | |||||
| protected void checkOptions() throws BuildException { | |||||
| if (tofile == null) { | |||||
| throw new BuildException("'tofile' attribute must be set."); | |||||
| } | |||||
| if (snapshot == null) { | |||||
| throw new BuildException("'snapshot' attribute must be set."); | |||||
| } | |||||
| if (home == null) { | |||||
| throw new BuildException("'home' attribute must be set to JProbe home directory"); | |||||
| } | |||||
| home = new File(home,"Coverage"); | |||||
| File jar = new File(home, "coverage.jar"); | |||||
| if (!jar.exists()) { | |||||
| throw new BuildException("Cannot find Coverage directory: " + home); | |||||
| } | |||||
| if (reference != null && !"xml".equals(format)){ | |||||
| log("Ignored reference. It cannot be used in non XML report."); | |||||
| reference = null; // nullify it so that there is no ambiguity | |||||
| } | |||||
| } | |||||
| public void execute() throws BuildException { | |||||
| checkOptions(); | |||||
| try { | |||||
| Commandline cmdl = new Commandline(); | |||||
| // we need to run Coverage from his directory due to dll/jar issues | |||||
| cmdl.setExecutable( new File(home, "jpcovreport").getAbsolutePath() ); | |||||
| String[] params = getParameters(); | |||||
| for (int i = 0; i < params.length; i++) { | |||||
| cmdl.createArgument().setValue(params[i]); | |||||
| } | |||||
| // use the custom handler for stdin issues | |||||
| LogStreamHandler handler = new LogStreamHandler(this,Project.MSG_INFO,Project.MSG_WARN); | |||||
| Execute exec = new Execute( handler ); | |||||
| log(cmdl.toString(), Project.MSG_VERBOSE); | |||||
| exec.setCommandline(cmdl.getCommandline()); | |||||
| int exitValue = exec.execute(); | |||||
| if (exitValue != 0) { | |||||
| throw new BuildException("JProbe Coverage Report failed (" + exitValue + ")"); | |||||
| } | |||||
| log("coveragePath: " + coveragePath, Project.MSG_VERBOSE); | |||||
| log("format: " + format, Project.MSG_VERBOSE); | |||||
| if (reference != null && "xml".equals(format)){ | |||||
| reference.createEnhancedXMLReport(); | |||||
| } | |||||
| } catch (IOException e){ | |||||
| throw new BuildException("Failed to execute JProbe Coverage Report.", e); | |||||
| } | |||||
| } | |||||
| protected String[] getParameters(){ | |||||
| Vector v = new Vector(); | |||||
| if (format != null) { | |||||
| v.addElement("-format=" + format); | |||||
| } | |||||
| if (type != null) { | |||||
| v.addElement("-type=" + type); | |||||
| } | |||||
| if (percent != null) { | |||||
| v.addElement("-percent=" + percent); | |||||
| } | |||||
| if (filters != null) { | |||||
| v.addElement("-filters=" + filters); | |||||
| } | |||||
| v.addElement("-output=" + project.resolveFile(tofile.getPath())); | |||||
| v.addElement("-snapshot=" + project.resolveFile(snapshot.getPath())); | |||||
| // as a default -sourcepath use . in JProbe, so use project . | |||||
| if (sourcePath == null) { | |||||
| sourcePath = new Path(project); | |||||
| sourcePath.createPath().setLocation(project.resolveFile(".")); | |||||
| } | |||||
| v.addElement("-sourcepath=" + sourcePath); | |||||
| if ("verydetailed".equalsIgnoreCase(format) && "xml".equalsIgnoreCase(type)) { | |||||
| v.addElement("-inc_src_text=" + (includeSource ? "on" : "off")); | |||||
| } | |||||
| String[] params = new String[v.size()]; | |||||
| v.copyInto(params); | |||||
| return params; | |||||
| } | |||||
| public class Reference { | |||||
| protected Path classPath; | |||||
| protected ReportFilters filters; | |||||
| public Path createClasspath(){ | |||||
| if (classPath == null) { | |||||
| classPath = new Path(project); | |||||
| } | |||||
| return classPath.createPath(); | |||||
| } | |||||
| public ReportFilters createFilters(){ | |||||
| if (filters == null){ | |||||
| filters = new ReportFilters(); | |||||
| } | |||||
| return filters; | |||||
| } | |||||
| protected void createEnhancedXMLReport() throws BuildException { | |||||
| // we need a classpath element | |||||
| if (classPath == null){ | |||||
| throw new BuildException("Need a 'classpath' element."); | |||||
| } | |||||
| // and a valid one... | |||||
| String[] paths = classPath.list(); | |||||
| if (paths.length == 0){ | |||||
| throw new BuildException("Coverage path is invalid. It does not contain any existing path."); | |||||
| } | |||||
| // and we need at least one filter include/exclude. | |||||
| if (filters == null || filters.size() == 0){ | |||||
| createFilters(); | |||||
| log("Adding default include filter to *.*()", Project.MSG_VERBOSE); | |||||
| ReportFilters.Include include = new ReportFilters.Include(); | |||||
| filters.addInclude( include ); | |||||
| } | |||||
| try { | |||||
| log("Creating enhanced XML report", Project.MSG_VERBOSE); | |||||
| XMLReport report = new XMLReport(CovReport.this, tofile); | |||||
| report.setReportFilters(filters); | |||||
| report.setJProbehome( new File(home.getParent()) ); | |||||
| Document doc = report.createDocument(paths); | |||||
| TransformerFactory tfactory = TransformerFactory.newInstance(); | |||||
| Transformer transformer = tfactory.newTransformer(); | |||||
| transformer.setOutputProperty(OutputKeys.INDENT, "yes"); | |||||
| transformer.setOutputProperty(OutputKeys.METHOD, "xml"); | |||||
| Source src = new DOMSource(doc); | |||||
| Result res = new StreamResult( "file:///" + tofile.toString() ); | |||||
| transformer.transform(src, res); | |||||
| } catch (Exception e){ | |||||
| throw new BuildException("Error while performing enhanced XML report from file " + tofile, e); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,461 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2000 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka; | |||||
| import java.io.PrintWriter; | |||||
| import java.io.StringWriter; | |||||
| import java.io.FileWriter; | |||||
| import java.io.File; | |||||
| import java.io.OutputStream; | |||||
| import java.io.IOException; | |||||
| import java.util.Vector; | |||||
| import java.util.Random; | |||||
| import java.util.Hashtable; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.Task; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.types.CommandlineJava; | |||||
| import org.apache.tools.ant.types.Commandline; | |||||
| import org.apache.tools.ant.types.EnumeratedAttribute; | |||||
| import org.apache.tools.ant.types.Path; | |||||
| import org.apache.tools.ant.types.FileSet; | |||||
| import org.apache.tools.ant.taskdefs.Execute; | |||||
| import org.apache.tools.ant.taskdefs.LogStreamHandler; | |||||
| /** | |||||
| * Convenient task to run Sitraka JProbe Coverage from Ant. | |||||
| * Options are pretty numerous, you'd better check the manual for a full | |||||
| * descriptions of options. (not that simple since they differ from the online | |||||
| * help, from the usage command line and from the examples...) | |||||
| * <p> | |||||
| * For additional information, visit <a href="http://www.sitraka.com">www.sitraka.com</a> | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class Coverage extends Task { | |||||
| protected File home; | |||||
| protected Commandline cmdl = new Commandline(); | |||||
| protected CommandlineJava cmdlJava = new CommandlineJava(); | |||||
| protected String function = "coverage"; | |||||
| protected String seedName; | |||||
| protected File inputFile; | |||||
| protected File javaExe; | |||||
| protected String vm; | |||||
| protected boolean applet = false; | |||||
| /** this is a somewhat annoying thing, set it to never */ | |||||
| protected String exitPrompt = "never"; | |||||
| protected Filters filters = new Filters(); | |||||
| protected Triggers triggers; | |||||
| protected String finalSnapshot = "coverage"; | |||||
| protected String recordFromStart = "coverage"; | |||||
| protected File snapshotDir; | |||||
| protected File workingDir; | |||||
| protected boolean trackNatives = false; | |||||
| protected Socket socket; | |||||
| protected int warnLevel = 0; | |||||
| protected Vector filesets = new Vector(); | |||||
| //--------- setters used via reflection -- | |||||
| /** set the coverage home directory where are libraries, jars and jplauncher */ | |||||
| public void setHome(File value){ | |||||
| home = value; | |||||
| } | |||||
| /** seed name for snapshot file. can be null, default to snap */ | |||||
| public void setSeedname(String value){ | |||||
| seedName = value; | |||||
| } | |||||
| public void setInputfile(File value){ | |||||
| inputFile = value; | |||||
| } | |||||
| public void setJavaexe(File value){ | |||||
| javaExe = value; | |||||
| } | |||||
| public static class Javavm extends EnumeratedAttribute { | |||||
| public String[] getValues(){ | |||||
| return new String[]{"java2", "jdk118", "jdk117"}; | |||||
| } | |||||
| } | |||||
| /** jdk117, jdk118 or java2, can be null, default to java2 */ | |||||
| public void setVm(Javavm value) { | |||||
| vm = value.getValue(); | |||||
| } | |||||
| /** default to false unless file is htm or html */ | |||||
| public void setApplet(boolean value){ | |||||
| applet = value; | |||||
| } | |||||
| /** always, error, never */ | |||||
| public void setExitprompt(String value){ | |||||
| exitPrompt = value; | |||||
| } | |||||
| public Filters createFilters(){ | |||||
| return filters; | |||||
| } | |||||
| public Triggers createTriggers(){ | |||||
| if (triggers == null) { | |||||
| triggers = new Triggers(); | |||||
| } | |||||
| return triggers; | |||||
| } | |||||
| public Socket createSocket(){ | |||||
| if (socket == null ) { | |||||
| socket = new Socket(); | |||||
| } | |||||
| return socket; | |||||
| } | |||||
| public static class Finalsnapshot extends EnumeratedAttribute { | |||||
| public String[] getValues(){ | |||||
| return new String[]{"coverage", "none", "all"}; | |||||
| } | |||||
| } | |||||
| /** none, coverage, all. can be null, default to none */ | |||||
| public void setFinalsnapshot(String value){ | |||||
| finalSnapshot = value; | |||||
| } | |||||
| public static class Recordfromstart extends EnumeratedAttribute { | |||||
| public String[] getValues(){ | |||||
| return new String[]{"coverage", "none", "all"}; | |||||
| } | |||||
| } | |||||
| /** all, coverage, none */ | |||||
| public void setRecordfromstart(Recordfromstart value) { | |||||
| recordFromStart = value.getValue(); | |||||
| } | |||||
| public void setWarnlevel(Integer value){ | |||||
| warnLevel = value.intValue(); | |||||
| } | |||||
| public void setSnapshotdir(File value){ | |||||
| snapshotDir = value; | |||||
| } | |||||
| public void setWorkingdir(File value){ | |||||
| workingDir = value; | |||||
| } | |||||
| public void setTracknatives(boolean value){ | |||||
| trackNatives = value; | |||||
| } | |||||
| // | |||||
| /** the jvm arguments */ | |||||
| public Commandline.Argument createJvmarg() { | |||||
| return cmdlJava.createVmArgument(); | |||||
| } | |||||
| /** the command arguments */ | |||||
| public Commandline.Argument createArg() { | |||||
| return cmdlJava.createArgument(); | |||||
| } | |||||
| /** classpath to run the files */ | |||||
| public Path createClasspath() { | |||||
| return cmdlJava.createClasspath(project).createPath(); | |||||
| } | |||||
| /** classname to run as standalone or runner for filesets */ | |||||
| public void setClassname(String value){ | |||||
| cmdlJava.setClassname(value); | |||||
| } | |||||
| /** the classnames to execute */ | |||||
| public void addFileset(FileSet fs){ | |||||
| filesets.addElement(fs); | |||||
| } | |||||
| //---------------- the tedious job begins here | |||||
| public Coverage(){ | |||||
| } | |||||
| /** execute the jplauncher by providing a parameter file */ | |||||
| public void execute() throws BuildException { | |||||
| File paramfile = null; | |||||
| // if an input file is used, all other options are ignored... | |||||
| if (inputFile == null){ | |||||
| checkOptions(); | |||||
| paramfile = createParamFile(); | |||||
| } else { | |||||
| paramfile = inputFile; | |||||
| } | |||||
| try { | |||||
| // we need to run Coverage from his directory due to dll/jar issues | |||||
| cmdl.setExecutable( new File(home, "jplauncher").getAbsolutePath() ); | |||||
| cmdl.createArgument().setValue("-jp_input=" + paramfile.getAbsolutePath()); | |||||
| // use the custom handler for stdin issues | |||||
| LogStreamHandler handler = new CoverageStreamHandler(this); | |||||
| Execute exec = new Execute( handler ); | |||||
| log(cmdl.toString(), Project.MSG_VERBOSE); | |||||
| exec.setCommandline(cmdl.getCommandline()); | |||||
| int exitValue = exec.execute(); | |||||
| if (exitValue != 0) { | |||||
| throw new BuildException("JProbe Coverage failed (" + exitValue + ")"); | |||||
| } | |||||
| } catch (IOException e){ | |||||
| throw new BuildException("Failed to execute JProbe Coverage.", e); | |||||
| } finally { | |||||
| //@todo should be removed once switched to JDK1.2 | |||||
| if (inputFile == null && paramfile != null){ | |||||
| paramfile.delete(); | |||||
| } | |||||
| } | |||||
| } | |||||
| /** wheck what is necessary to check, Coverage will do the job for us */ | |||||
| protected void checkOptions() throws BuildException { | |||||
| // check coverage home | |||||
| if (home == null || !home.isDirectory() ) { | |||||
| throw new BuildException("Invalid home directory. Must point to JProbe home directory"); | |||||
| } | |||||
| home = new File(home,"Coverage"); | |||||
| File jar = new File(home, "coverage.jar"); | |||||
| if (!jar.exists()) { | |||||
| throw new BuildException("Cannot find Coverage directory: " + home); | |||||
| } | |||||
| // make sure snapshot dir exists and is resolved | |||||
| if (snapshotDir == null) { | |||||
| snapshotDir = new File("."); | |||||
| } | |||||
| snapshotDir = project.resolveFile(snapshotDir.getPath()); | |||||
| if (!snapshotDir.isDirectory() || !snapshotDir.exists()) { | |||||
| throw new BuildException("Snapshot directory does not exists :" + snapshotDir); | |||||
| } | |||||
| if (workingDir == null) { | |||||
| workingDir = new File("."); | |||||
| } | |||||
| workingDir = project.resolveFile(workingDir.getPath()); | |||||
| // check for info, do your best to select the java executable. | |||||
| // JProbe 3.0 fails if there is no javaexe option. So | |||||
| if (javaExe == null && ( vm == null || "java2".equals(vm) ) ) { | |||||
| String version = System.getProperty("java.version"); | |||||
| // make we are using 1.2+, if it is, then do your best to | |||||
| // get a javaexe | |||||
| if ( !version.startsWith("1.1") ){ | |||||
| if (vm == null){ | |||||
| vm = "java2"; | |||||
| } | |||||
| // if we are here obviously it is java2 | |||||
| String home = System.getProperty("java.home"); | |||||
| boolean isUnix = File.separatorChar == '/'; | |||||
| javaExe = isUnix ? new File(home, "bin/java") : new File(home,"/bin/java.exe"); | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * return the command line parameters. Parameters can either be passed | |||||
| * to the command line and stored to a file (then use the -jp_input=<filename>) | |||||
| * if they are too numerous. | |||||
| */ | |||||
| protected String[] getParameters(){ | |||||
| Vector params = new Vector(); | |||||
| params.addElement("-jp_function=" + function); | |||||
| if (vm != null) { | |||||
| params.addElement("-jp_vm=" + vm); | |||||
| } | |||||
| if (javaExe != null) { | |||||
| params.addElement("-jp_java_exe=" + project.resolveFile(javaExe.getPath())); | |||||
| } | |||||
| params.addElement("-jp_working_dir=" + workingDir.getPath() ); | |||||
| params.addElement("-jp_snapshot_dir=" + snapshotDir.getPath() ); | |||||
| params.addElement("-jp_record_from_start=" + recordFromStart); | |||||
| params.addElement("-jp_warn=" + warnLevel); | |||||
| if (seedName != null) { | |||||
| params.addElement("-jp_output_file=" + seedName); | |||||
| } | |||||
| params.addElement("-jp_filter=" + filters.toString() ); | |||||
| if (triggers != null) { | |||||
| params.addElement("-jp_trigger=" + triggers.toString() ); | |||||
| } | |||||
| if (finalSnapshot != null) { | |||||
| params.addElement("-jp_final_snapshot=" + finalSnapshot); | |||||
| } | |||||
| params.addElement("-jp_exit_prompt=" + exitPrompt); | |||||
| //params.addElement("-jp_append=" + append); | |||||
| params.addElement("-jp_track_natives=" + trackNatives); | |||||
| //.... now the jvm | |||||
| // arguments | |||||
| String[] vmargs = cmdlJava.getVmCommand().getArguments(); | |||||
| for (int i = 0; i < vmargs.length; i++) { | |||||
| params.addElement(vmargs[i]); | |||||
| } | |||||
| // classpath | |||||
| Path classpath = cmdlJava.getClasspath(); | |||||
| if (classpath != null && classpath.size() > 0) { | |||||
| params.addElement("-classpath " + classpath.toString()); | |||||
| } | |||||
| // classname (runner or standalone) | |||||
| if (cmdlJava.getClassname() != null) { | |||||
| params.addElement(cmdlJava.getClassname()); | |||||
| } | |||||
| // arguments for classname | |||||
| String[] args = cmdlJava.getJavaCommand().getArguments(); | |||||
| for (int i = 0; i < args.length; i++) { | |||||
| params.addElement(args[i]); | |||||
| } | |||||
| String[] array = new String[params.size()]; | |||||
| params.copyInto(array); | |||||
| return array; | |||||
| } | |||||
| /** | |||||
| * create the parameter file from the given options. The file is | |||||
| * created with a random name in the current directory. | |||||
| * @return the file object where are written the configuration to run | |||||
| * JProbe Coverage | |||||
| * @throws BuildException thrown if something bad happens while writing | |||||
| * the arguments to the file. | |||||
| */ | |||||
| protected File createParamFile() throws BuildException { | |||||
| //@todo change this when switching to JDK 1.2 and use File.createTmpFile() | |||||
| File file = createTmpFile(); | |||||
| log("Creating parameter file: " + file, Project.MSG_VERBOSE); | |||||
| // options need to be one per line in the parameter file | |||||
| // so write them all in a single string | |||||
| StringWriter sw = new StringWriter(); | |||||
| PrintWriter pw = new PrintWriter(sw); | |||||
| String[] params = getParameters(); | |||||
| for (int i = 0; i < params.length; i++){ | |||||
| pw.println(params[i]); | |||||
| } | |||||
| pw.flush(); | |||||
| log("JProbe Coverage parameters:\n" + sw.toString(), Project.MSG_VERBOSE); | |||||
| // now write them to the file | |||||
| FileWriter fw = null; | |||||
| try { | |||||
| fw = new FileWriter(file); | |||||
| fw.write(sw.toString()); | |||||
| fw.flush(); | |||||
| } catch (IOException e){ | |||||
| throw new BuildException("Could not write parameter file " + file, e); | |||||
| } finally { | |||||
| if (fw != null) { | |||||
| try { | |||||
| fw.close(); | |||||
| } catch (IOException ignored){} | |||||
| } | |||||
| } | |||||
| return file; | |||||
| } | |||||
| /** create a temporary file in the current dir (For JDK1.1 support) */ | |||||
| protected File createTmpFile(){ | |||||
| final long rand = (new Random(System.currentTimeMillis())).nextLong(); | |||||
| File file = new File("jpcoverage" + rand + ".tmp"); | |||||
| return file; | |||||
| } | |||||
| /** specific pumper to avoid those nasty stdin issues */ | |||||
| static class CoverageStreamHandler extends LogStreamHandler { | |||||
| CoverageStreamHandler(Task task){ | |||||
| super(task, Project.MSG_INFO, Project.MSG_WARN); | |||||
| } | |||||
| /** | |||||
| * there are some issues concerning all JProbe executable | |||||
| * In our case a 'Press ENTER to close this window..." will | |||||
| * be displayed in the current window waiting for enter. | |||||
| * So I'm closing the stream right away to avoid problems. | |||||
| */ | |||||
| public void setProcessInputStream(OutputStream os) { | |||||
| try { | |||||
| os.close(); | |||||
| } catch (IOException ignored){ | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,143 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2000 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka; | |||||
| import java.util.Vector; | |||||
| /** | |||||
| * Filters information from coverage, somewhat similar to a <tt>FileSet</tt>. | |||||
| * | |||||
| * @author <a href="mailto:sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class Filters { | |||||
| /** default regexp to exclude everything */ | |||||
| public final static String DEFAULT_EXCLUDE = "*.*():E"; | |||||
| /** say whether we should use the default excludes or not */ | |||||
| protected boolean defaultExclude = true; | |||||
| /** user defined filters */ | |||||
| protected Vector filters = new Vector(); | |||||
| public Filters(){ | |||||
| } | |||||
| public void setDefaultExclude(boolean value){ | |||||
| defaultExclude = value; | |||||
| } | |||||
| public void addInclude(Include incl){ | |||||
| filters.addElement(incl); | |||||
| } | |||||
| public void addExclude(Exclude excl){ | |||||
| filters.addElement(excl); | |||||
| } | |||||
| public String toString(){ | |||||
| StringBuffer buf = new StringBuffer(); | |||||
| final int size = filters.size(); | |||||
| if (defaultExclude) { | |||||
| buf.append(DEFAULT_EXCLUDE); | |||||
| if (size > 0) { | |||||
| buf.append(','); | |||||
| } | |||||
| } | |||||
| for (int i = 0; i < size; i++) { | |||||
| buf.append(filters.elementAt(i).toString()); | |||||
| if ( i < size - 1) { | |||||
| buf.append(','); | |||||
| } | |||||
| } | |||||
| return buf.toString(); | |||||
| } | |||||
| public static abstract class FilterElement { | |||||
| protected String clazz; | |||||
| protected String method = "*"; // default is all methods | |||||
| protected boolean enabled = true; // default is enable | |||||
| public void setName(String value){ // this one is deprecated. | |||||
| clazz = value; | |||||
| } | |||||
| public void setClass(String value){ | |||||
| clazz = value; | |||||
| } | |||||
| public void setMethod(String value){ | |||||
| method = value; | |||||
| } | |||||
| public void setEnabled(boolean value){ | |||||
| enabled = value; | |||||
| } | |||||
| public String toString(){ | |||||
| return clazz + "." + method + "()"; | |||||
| } | |||||
| } | |||||
| public static class Include extends FilterElement { | |||||
| public String toString(){ | |||||
| return super.toString() + ":I" + (enabled ? "" : "#"); | |||||
| } | |||||
| } | |||||
| public static class Exclude extends FilterElement { | |||||
| public String toString() { | |||||
| return super.toString() + ":E" + (enabled ? "" : "#"); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,165 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2000 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka; | |||||
| import java.util.Vector; | |||||
| import java.util.Enumeration; | |||||
| import org.apache.tools.ant.util.regexp.*; | |||||
| /** | |||||
| * Filters information from coverage, somewhat similar to a <tt>FileSet</tt>. | |||||
| * | |||||
| * @author <a href="mailto:sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class ReportFilters { | |||||
| /** user defined filters */ | |||||
| protected Vector filters = new Vector(); | |||||
| /** cached matcher for each filter */ | |||||
| protected Vector matchers = null; | |||||
| public ReportFilters(){ | |||||
| } | |||||
| public void addInclude(Include incl){ | |||||
| filters.addElement(incl); | |||||
| } | |||||
| public void addExclude(Exclude excl){ | |||||
| filters.addElement(excl); | |||||
| } | |||||
| public int size(){ | |||||
| return filters.size(); | |||||
| } | |||||
| /** | |||||
| * Check whether a given <classname><method>() is accepted by the list | |||||
| * of filters or not. | |||||
| * @param methodname the full method name in the format <classname><method>() | |||||
| */ | |||||
| public boolean accept(String methodname){ | |||||
| // I'm deferring matcher instantiations at runtime to avoid computing | |||||
| // the filters at parsing time | |||||
| if (matchers == null){ | |||||
| createMatchers(); | |||||
| } | |||||
| boolean result = false; | |||||
| // assert filters.size() == matchers.size() | |||||
| final int size = filters.size(); | |||||
| for (int i = 0; i < size; i++){ | |||||
| FilterElement filter = (FilterElement)filters.elementAt(i); | |||||
| RegexpMatcher matcher = (RegexpMatcher)matchers.elementAt(i); | |||||
| if (filter instanceof Include){ | |||||
| result = result || matcher.matches(methodname); | |||||
| } else if (filter instanceof Exclude){ | |||||
| result = result && !matcher.matches(methodname); | |||||
| } else{ | |||||
| //not possible | |||||
| throw new IllegalArgumentException("Invalid filter element: " + filter.getClass().getName()); | |||||
| } | |||||
| } | |||||
| return result; | |||||
| } | |||||
| /** should be called only once to cache matchers */ | |||||
| protected void createMatchers(){ | |||||
| RegexpMatcherFactory factory = new RegexpMatcherFactory(); | |||||
| final int size = filters.size(); | |||||
| matchers = new Vector(); | |||||
| for (int i = 0; i < size; i++){ | |||||
| FilterElement filter = (FilterElement)filters.elementAt(i); | |||||
| RegexpMatcher matcher = factory.newRegexpMatcher(); | |||||
| String pattern = filter.getAsPattern(); | |||||
| matcher.setPattern(pattern); | |||||
| matchers.addElement(matcher); | |||||
| } | |||||
| } | |||||
| /** default abstract filter element class */ | |||||
| public static abstract class FilterElement { | |||||
| protected String clazz = "*"; // default is all classes | |||||
| protected String method = "*"; // default is all methods | |||||
| public void setClass(String value){ | |||||
| clazz = value; | |||||
| } | |||||
| public void setMethod(String value){ | |||||
| method = value; | |||||
| } | |||||
| public String getAsPattern(){ | |||||
| StringBuffer buf = new StringBuffer(toString()); | |||||
| StringUtil.replace(buf, ".", "\\."); | |||||
| StringUtil.replace(buf, "*", ".*"); | |||||
| StringUtil.replace(buf, "(", "\\("); | |||||
| StringUtil.replace(buf, ")", "\\)"); | |||||
| return buf.toString(); | |||||
| } | |||||
| public String toString(){ | |||||
| return clazz + "." + method + "()"; | |||||
| } | |||||
| } | |||||
| /** concrete include class */ | |||||
| public static class Include extends FilterElement {} | |||||
| /** concrete exclude class */ | |||||
| public static class Exclude extends FilterElement {} | |||||
| } | |||||
| @@ -0,0 +1,85 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2000 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka; | |||||
| /** | |||||
| * Socket element for connection. | |||||
| * <tt><socket/></tt> defaults to host 127.0.0.1 and port 4444 | |||||
| * | |||||
| * Otherwise it requires the host and port attributes to be set: | |||||
| * <tt> | |||||
| * <socket host="e;175.30.12.1"e; port="e;4567"e;/> | |||||
| * </tt> | |||||
| */ | |||||
| public class Socket { | |||||
| /** default to localhost */ | |||||
| private String host = "127.0.0.1"; | |||||
| /** default to 4444 */ | |||||
| private int port = 4444; | |||||
| public void setHost(String value){ | |||||
| host = value; | |||||
| } | |||||
| public void setPort(Integer value){ | |||||
| port = value.intValue(); | |||||
| } | |||||
| /** if no host is set, returning ':<port>', will take localhost */ | |||||
| public String toString(){ | |||||
| return host + ":" + port; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,84 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2000 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka; | |||||
| /** | |||||
| * String utilities method. | |||||
| * @author <a href="mailto:sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public final class StringUtil { | |||||
| /** private constructor, it's a utility class */ | |||||
| private StringUtil() { | |||||
| } | |||||
| /** | |||||
| * Replaces all occurences of <tt>find</tt> with <tt>replacement</tt> in the | |||||
| * source StringBuffer. | |||||
| * @param src the original string buffer to modify. | |||||
| * @param find the string to be replaced. | |||||
| * @param replacement the replacement string for <tt>find</tt> matches. | |||||
| */ | |||||
| public static void replace(StringBuffer src, String find, String replacement){ | |||||
| int index = 0; | |||||
| while (index < src.length() ){ | |||||
| index = src.toString().indexOf(find, index); | |||||
| if (index == -1){ | |||||
| break; | |||||
| } | |||||
| src.delete(index, index + find.length()); | |||||
| src.insert(index, replacement); | |||||
| index += replacement.length() + 1; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,147 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2000 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka; | |||||
| import java.util.Vector; | |||||
| import java.util.Hashtable; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| /** | |||||
| * Trigger information. It will return as a command line argument by calling | |||||
| * the <tt>toString()</tt> method. | |||||
| * | |||||
| * @author <a href="mailto:sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class Triggers { | |||||
| protected Vector triggers = new Vector(); | |||||
| public Triggers(){ | |||||
| } | |||||
| public void addMethod(Method method){ | |||||
| triggers.addElement(method); | |||||
| } | |||||
| // -jp_trigger=ClassName.*():E:S,ClassName.MethodName():X:X | |||||
| public String toString(){ | |||||
| StringBuffer buf = new StringBuffer(); | |||||
| final int size = triggers.size(); | |||||
| for(int i = 0; i < size; i++) { | |||||
| buf.append( triggers.elementAt(i).toString() ); | |||||
| if (i < size - 1) { | |||||
| buf.append(','); | |||||
| } | |||||
| } | |||||
| return buf.toString(); | |||||
| } | |||||
| public static class Method { | |||||
| protected String name; | |||||
| protected String event; | |||||
| protected String action; | |||||
| protected String param; | |||||
| public void setName(String value){ | |||||
| name = value; | |||||
| } | |||||
| public void setEvent(String value){ | |||||
| if (eventMap.get(value) == null) { | |||||
| throw new BuildException("Invalid event, must be one of " + eventMap); | |||||
| } | |||||
| event = value; | |||||
| } | |||||
| public void setAction(String value) throws BuildException { | |||||
| if (actionMap.get(value) == null) { | |||||
| throw new BuildException("Invalid action, must be one of " + actionMap); | |||||
| } | |||||
| action = value; | |||||
| } | |||||
| public void setParam(String value){ | |||||
| param = value; | |||||
| } | |||||
| // return <name>:<event>:<action>[:param] | |||||
| public String toString(){ | |||||
| StringBuffer buf = new StringBuffer(); | |||||
| buf.append(name).append(":"); //@todo name must not be null, check for it | |||||
| buf.append(eventMap.get(event)).append(":"); | |||||
| buf.append(actionMap.get(action)); | |||||
| if (param != null) { | |||||
| buf.append(":").append(param); | |||||
| } | |||||
| return buf.toString(); | |||||
| } | |||||
| } | |||||
| /** mapping of actions to cryptic command line mnemonics */ | |||||
| private final static Hashtable actionMap = new Hashtable(3); | |||||
| /** mapping of events to cryptic command line mnemonics */ | |||||
| private final static Hashtable eventMap = new Hashtable(3); | |||||
| static { | |||||
| actionMap.put("enter", "E"); | |||||
| actionMap.put("exit", "X"); | |||||
| // clear|pause|resume|snapshot|suspend|exit | |||||
| eventMap.put("clear", "C"); | |||||
| eventMap.put("pause", "P"); | |||||
| eventMap.put("resume", "R"); | |||||
| eventMap.put("snapshot", "S"); | |||||
| eventMap.put("suspend", "A"); | |||||
| eventMap.put("exit", "X"); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,573 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka; | |||||
| import javax.xml.parsers.DocumentBuilder; | |||||
| import javax.xml.parsers.DocumentBuilderFactory; | |||||
| import javax.xml.transform.*; | |||||
| import javax.xml.transform.dom.*; | |||||
| import javax.xml.transform.stream.*; | |||||
| import org.w3c.dom.*; | |||||
| import org.xml.sax.*; | |||||
| import java.io.*; | |||||
| import java.util.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.sitraka.bytecode.*; | |||||
| import org.apache.tools.ant.Task; | |||||
| import org.apache.tools.ant.Project; | |||||
| /** | |||||
| * Little hack to process XML report from JProbe. It will fix | |||||
| * some reporting errors from JProbe 3.0 and makes use of a reference | |||||
| * classpath to add classes/methods that were not reported by JProbe | |||||
| * as being used (ie loaded) | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class XMLReport { | |||||
| /** task caller, can be null, used for logging purpose */ | |||||
| protected Task task; | |||||
| /** the XML file to process just from CovReport */ | |||||
| protected File file; | |||||
| /** jprobe home path. It is used to get the DTD */ | |||||
| protected File jprobeHome; | |||||
| /** parsed document */ | |||||
| protected Document report; | |||||
| /** mapping package name / package node for faster access */ | |||||
| protected Hashtable pkgMap; | |||||
| /** mapping classname / class node for faster access */ | |||||
| protected Hashtable classMap; | |||||
| /** method filters */ | |||||
| protected ReportFilters filters; | |||||
| /** create a new XML report, logging will be on stdout */ | |||||
| public XMLReport(File file){ | |||||
| this(null, file); | |||||
| } | |||||
| /** create a new XML report, logging done on the task */ | |||||
| public XMLReport(Task task, File file){ | |||||
| this.file = file; | |||||
| this.task = task; | |||||
| } | |||||
| /** set the JProbe home path. Used to get the DTD */ | |||||
| public void setJProbehome(File home){ | |||||
| jprobeHome = home; | |||||
| } | |||||
| /** set the */ | |||||
| public void setReportFilters(ReportFilters filters){ | |||||
| this.filters = filters; | |||||
| } | |||||
| /** create node maps so that we can access node faster by their name */ | |||||
| protected void createNodeMaps(){ | |||||
| pkgMap = new Hashtable(); | |||||
| classMap = new Hashtable(); | |||||
| // create a map index of all packages by their name | |||||
| // @todo can be done faster by direct access. | |||||
| NodeList packages = report.getElementsByTagName("package"); | |||||
| final int pkglen = packages.getLength(); | |||||
| log("Indexing " + pkglen + " packages"); | |||||
| for (int i = pkglen-1; i > -1 ; i--){ | |||||
| Element pkg = (Element)packages.item(i); | |||||
| String pkgname = pkg.getAttribute("name"); | |||||
| int nbclasses = 0; | |||||
| // create a map index of all classes by their fully | |||||
| // qualified name. | |||||
| NodeList classes = pkg.getElementsByTagName("class"); | |||||
| final int classlen = classes.getLength(); | |||||
| log("Indexing " + classlen + " classes in package " + pkgname); | |||||
| for (int j = classlen-1; j > -1 ; j--){ | |||||
| Element clazz = (Element)classes.item(j); | |||||
| String classname = clazz.getAttribute("name"); | |||||
| if (pkgname != null && pkgname.length() != 0){ | |||||
| classname = pkgname + "." + classname; | |||||
| } | |||||
| int nbmethods = 0; | |||||
| NodeList methods = clazz.getElementsByTagName("method"); | |||||
| final int methodlen = methods.getLength(); | |||||
| for (int k = methodlen-1; k > -1; k--){ | |||||
| Element meth = (Element)methods.item(k); | |||||
| StringBuffer methodname = new StringBuffer(meth.getAttribute("name")); | |||||
| methodname.delete(methodname.toString().indexOf("(") , methodname.toString().length()); | |||||
| String signature = classname + "." + methodname + "()"; | |||||
| if (filters.accept(signature)){ | |||||
| log("keeped method:" + signature); | |||||
| nbmethods++; | |||||
| } | |||||
| else { | |||||
| clazz.removeChild(meth); | |||||
| } | |||||
| } | |||||
| // if we don't keep any method, we don't keep the class | |||||
| if (nbmethods != 0){ | |||||
| log("Adding class '" + classname + "'"); | |||||
| classMap.put(classname, clazz); | |||||
| nbclasses++; | |||||
| } | |||||
| else { | |||||
| pkg.removeChild(clazz); | |||||
| } | |||||
| } | |||||
| if (nbclasses != 0){ | |||||
| log("Adding package '" + pkgname + "'"); | |||||
| pkgMap.put(pkgname, pkg); | |||||
| } | |||||
| else { | |||||
| pkg.getParentNode().removeChild(pkg); | |||||
| } | |||||
| } | |||||
| log("Indexed " + classMap.size() + " classes in " + pkgMap.size() + " packages"); | |||||
| } | |||||
| /** create the whole new document */ | |||||
| public Document createDocument(String[] classPath) throws Exception { | |||||
| DocumentBuilder dbuilder = newBuilder(); | |||||
| InputSource is = new InputSource( new FileInputStream(file) ); | |||||
| if (jprobeHome != null){ | |||||
| File dtdDir = new File(jprobeHome, "Dtd/snapshot.dtd"); | |||||
| is.setSystemId( "file:///" + dtdDir.getAbsolutePath() ); | |||||
| } | |||||
| report = dbuilder.parse( is ); | |||||
| report.normalize(); | |||||
| // create maps for faster node access | |||||
| createNodeMaps(); | |||||
| // iterate over the classpath... | |||||
| ClassPathLoader cpl = new ClassPathLoader(classPath); | |||||
| Enumeration enum = cpl.loaders(); | |||||
| while ( enum.hasMoreElements() ){ | |||||
| ClassPathLoader.FileLoader fl = (ClassPathLoader.FileLoader)enum.nextElement(); | |||||
| ClassFile[] classes = fl.getClasses(); | |||||
| log("Processing " + classes.length + " classes in " + fl.getFile()); | |||||
| // process all classes | |||||
| for (int i = 0; i < classes.length; i++){ | |||||
| serializeClass(classes[i]); | |||||
| } | |||||
| } | |||||
| // update the document with the stats | |||||
| update(); | |||||
| return report; | |||||
| } | |||||
| /** | |||||
| * JProbe does not put the java.lang prefix for classes | |||||
| * in this package, so used this nice method so that | |||||
| * I have the same signature for methods | |||||
| */ | |||||
| protected String getMethodSignature(MethodInfo method){ | |||||
| StringBuffer buf = new StringBuffer(method.getName()); | |||||
| buf.append("("); | |||||
| String[] params = method.getParametersType(); | |||||
| for (int i = 0; i < params.length; i++){ | |||||
| String type = params[i]; | |||||
| int pos = type.lastIndexOf('.'); | |||||
| if (pos != -1){ | |||||
| String pkg = type.substring(0, pos); | |||||
| if ("java.lang".equals(pkg)){ | |||||
| params[i] = type.substring(pos + 1); | |||||
| } | |||||
| } | |||||
| buf.append(params[i]); | |||||
| if (i != params.length - 1){ | |||||
| buf.append(", "); | |||||
| } | |||||
| } | |||||
| buf.append(")"); | |||||
| return buf.toString(); | |||||
| } | |||||
| /** | |||||
| * Convert to a CovReport-like signature ie, <classname>.<method>() | |||||
| */ | |||||
| protected String getMethodSignature(ClassFile clazz, MethodInfo method){ | |||||
| StringBuffer buf = new StringBuffer(clazz.getFullName()); | |||||
| buf.append("."); | |||||
| buf.append(method.getName()); | |||||
| buf.append("()"); | |||||
| return buf.toString(); | |||||
| } | |||||
| /** | |||||
| * Do additional work on an element to remove abstract methods that | |||||
| * are reported by JProbe 3.0 | |||||
| */ | |||||
| protected void removeAbstractMethods(ClassFile classFile, Element classNode){ | |||||
| MethodInfoList methods = classFile.getMethods(); | |||||
| Hashtable methodNodeList = getMethods(classNode); | |||||
| // assert xmlMethods.size() == methods.length() | |||||
| final int size = methods.length(); | |||||
| for (int i = 0; i < size; i++){ | |||||
| MethodInfo method = methods.getMethod(i); | |||||
| String methodSig = getMethodSignature(method); | |||||
| Element methodNode = (Element)methodNodeList.get(methodSig); | |||||
| if ( methodNode != null && | |||||
| Utils.isAbstract(method.getAccessFlags())) { | |||||
| log("\tRemoving method " + methodSig); | |||||
| classNode.removeChild(methodNode); | |||||
| } | |||||
| } | |||||
| } | |||||
| /** create an empty method element with its cov.data values */ | |||||
| protected Element createMethodElement(MethodInfo method){ | |||||
| String methodsig = getMethodSignature(method); | |||||
| Element methodElem = report.createElement("method"); | |||||
| methodElem.setAttribute("name", methodsig); | |||||
| // create the method cov.data element | |||||
| Element methodData = report.createElement("cov.data"); | |||||
| methodElem.appendChild(methodData); | |||||
| methodData.setAttribute("calls", "0"); | |||||
| methodData.setAttribute("hit_lines", "0"); | |||||
| methodData.setAttribute("total_lines", String.valueOf(method.getNumberOfLines())); | |||||
| return methodElem; | |||||
| } | |||||
| /** create an empty package element with its default cov.data (0) */ | |||||
| protected Element createPackageElement(String pkgname){ | |||||
| Element pkgElem = report.createElement("package"); | |||||
| pkgElem.setAttribute("name", pkgname); | |||||
| // create the package cov.data element / default | |||||
| // must be updated at the end of the whole process | |||||
| Element pkgData = report.createElement("cov.data"); | |||||
| pkgElem.appendChild(pkgData); | |||||
| pkgData.setAttribute("calls", "0"); | |||||
| pkgData.setAttribute("hit_methods", "0"); | |||||
| pkgData.setAttribute("total_methods", "0"); | |||||
| pkgData.setAttribute("hit_lines", "0"); | |||||
| pkgData.setAttribute("total_lines", "0"); | |||||
| return pkgElem; | |||||
| } | |||||
| /** create an empty class element with its default cov.data (0) */ | |||||
| protected Element createClassElement(ClassFile classFile){ | |||||
| // create the class element | |||||
| Element classElem = report.createElement("class"); | |||||
| classElem.setAttribute("name", classFile.getName()); | |||||
| classElem.setAttribute("source", classFile.getSourceFile()); | |||||
| // create the cov.data elem | |||||
| Element classData = report.createElement("cov.data"); | |||||
| classElem.appendChild(classData); | |||||
| // create the class cov.data element | |||||
| classData.setAttribute("calls", "0"); | |||||
| classData.setAttribute("hit_methods", "0"); | |||||
| classData.setAttribute("total_methods", "0"); | |||||
| classData.setAttribute("hit_lines", "0"); | |||||
| classData.setAttribute("total_lines", "0"); | |||||
| return classElem; | |||||
| } | |||||
| /** serialize a classfile into XML */ | |||||
| protected void serializeClass(ClassFile classFile){ | |||||
| // the class already is reported so ignore it | |||||
| String fullclassname = classFile.getFullName(); | |||||
| log("Looking for '" + fullclassname + "'"); | |||||
| Element clazz = (Element)classMap.get(fullclassname); | |||||
| // ignore classes that are already reported, all the information is | |||||
| // already there. | |||||
| if ( clazz != null ){ | |||||
| log("Ignoring " + fullclassname); | |||||
| removeAbstractMethods(classFile, clazz); | |||||
| return; | |||||
| } | |||||
| // ignore interfaces files, there is no code in there to cover. | |||||
| if (Utils.isInterface(classFile.getAccess())){ | |||||
| return; | |||||
| } | |||||
| Vector methods = getFilteredMethods(classFile); | |||||
| // no need to process, there are no methods to add for this class. | |||||
| if (methods.size() == 0){ | |||||
| return; | |||||
| } | |||||
| String pkgname = classFile.getPackage(); | |||||
| // System.out.println("Looking for package " + pkgname); | |||||
| Element pkgElem = (Element)pkgMap.get(pkgname); | |||||
| if (pkgElem == null){ | |||||
| pkgElem = createPackageElement(pkgname); | |||||
| report.getDocumentElement().appendChild(pkgElem); | |||||
| pkgMap.put(pkgname, pkgElem); // add the pkg to the map | |||||
| } | |||||
| // this is a brand new class, so we have to create a new node | |||||
| // create the class element | |||||
| Element classElem = createClassElement(classFile); | |||||
| pkgElem.appendChild(classElem); | |||||
| int total_lines = 0; | |||||
| int total_methods = 0; | |||||
| for (int i = 0; i < methods.size(); i++){ | |||||
| // create the method element | |||||
| MethodInfo method = (MethodInfo)methods.elementAt(i); | |||||
| if ( Utils.isAbstract(method.getAccessFlags() ) ){ | |||||
| continue; // no need to report abstract methods | |||||
| } | |||||
| Element methodElem = createMethodElement(method); | |||||
| classElem.appendChild(methodElem); | |||||
| total_lines += method.getNumberOfLines(); | |||||
| total_methods++; | |||||
| } | |||||
| // create the class cov.data element | |||||
| Element classData = getCovDataChild(classElem); | |||||
| classData.setAttribute("total_methods", String.valueOf(total_methods)); | |||||
| classData.setAttribute("total_lines", String.valueOf(total_lines)); | |||||
| // add itself to the node map | |||||
| classMap.put(fullclassname, classElem); | |||||
| } | |||||
| protected Vector getFilteredMethods(ClassFile classFile){ | |||||
| Vector methods = new Vector(); | |||||
| MethodInfoList methodlist = classFile.getMethods(); | |||||
| for (int i = 0; i < methodlist.length(); i++){ | |||||
| MethodInfo method = methodlist.getMethod(i); | |||||
| String signature = getMethodSignature(classFile, method); | |||||
| if (filters.accept(signature)){ | |||||
| methods.addElement(method); | |||||
| log("keeping " + signature); | |||||
| } else { | |||||
| // log("discarding " + signature); | |||||
| } | |||||
| } | |||||
| return methods; | |||||
| } | |||||
| /** update the count of the XML, that is accumulate the stats on | |||||
| * methods, classes and package so that the numbers are valid | |||||
| * according to the info that was appended to the XML. | |||||
| */ | |||||
| protected void update(){ | |||||
| int calls = 0; | |||||
| int hit_methods = 0; | |||||
| int total_methods = 0; | |||||
| int hit_lines = 0; | |||||
| int total_lines = 0; | |||||
| // use the map for access, all nodes should be there | |||||
| Enumeration enum = pkgMap.elements(); | |||||
| while ( enum.hasMoreElements() ){ | |||||
| Element pkgElem = (Element)enum.nextElement(); | |||||
| String pkgname = pkgElem.getAttribute("name"); | |||||
| Element[] classes = getClasses(pkgElem); | |||||
| int pkg_calls = 0; | |||||
| int pkg_hit_methods = 0; | |||||
| int pkg_total_methods = 0; | |||||
| int pkg_hit_lines = 0; | |||||
| int pkg_total_lines = 0; | |||||
| //System.out.println("Processing package '" + pkgname + "': " + classes.length + " classes"); | |||||
| for (int j = 0; j < classes.length; j++){ | |||||
| Element clazz = classes[j]; | |||||
| String classname = clazz.getAttribute("name"); | |||||
| if (pkgname != null && pkgname.length() != 0){ | |||||
| classname = pkgname + "." + classname; | |||||
| } | |||||
| // there's only cov.data as a child so bet on it | |||||
| Element covdata = getCovDataChild(clazz); | |||||
| try { | |||||
| pkg_calls += Integer.parseInt(covdata.getAttribute("calls")); | |||||
| pkg_hit_methods += Integer.parseInt(covdata.getAttribute("hit_methods")); | |||||
| pkg_total_methods += Integer.parseInt(covdata.getAttribute("total_methods")); | |||||
| pkg_hit_lines += Integer.parseInt(covdata.getAttribute("hit_lines")); | |||||
| pkg_total_lines += Integer.parseInt(covdata.getAttribute("total_lines")); | |||||
| } catch (NumberFormatException e){ | |||||
| System.err.println("Error parsing '" + classname + "' (" + j + "/" + classes.length + ") in package '" + pkgname + "'"); | |||||
| throw e; | |||||
| } | |||||
| } | |||||
| Element covdata = getCovDataChild(pkgElem); | |||||
| covdata.setAttribute("calls", String.valueOf(pkg_calls)); | |||||
| covdata.setAttribute("hit_methods", String.valueOf(pkg_hit_methods)); | |||||
| covdata.setAttribute("total_methods", String.valueOf(pkg_total_methods)); | |||||
| covdata.setAttribute("hit_lines", String.valueOf(pkg_hit_lines)); | |||||
| covdata.setAttribute("total_lines", String.valueOf(pkg_total_lines)); | |||||
| calls += pkg_calls; | |||||
| hit_methods += pkg_hit_methods; | |||||
| total_methods += pkg_total_methods; | |||||
| hit_lines += pkg_hit_lines; | |||||
| total_lines += pkg_total_lines; | |||||
| } | |||||
| Element covdata = getCovDataChild(report.getDocumentElement()); | |||||
| covdata.setAttribute("calls", String.valueOf(calls)); | |||||
| covdata.setAttribute("hit_methods", String.valueOf(hit_methods)); | |||||
| covdata.setAttribute("total_methods", String.valueOf(total_methods)); | |||||
| covdata.setAttribute("hit_lines", String.valueOf(hit_lines)); | |||||
| covdata.setAttribute("total_lines", String.valueOf(total_lines)); | |||||
| } | |||||
| protected Element getCovDataChild(Element parent){ | |||||
| NodeList children = parent.getChildNodes(); | |||||
| int len = children.getLength(); | |||||
| for (int i = 0; i < len; i++){ | |||||
| Node child = children.item(i); | |||||
| if (child.getNodeType() == Node.ELEMENT_NODE){ | |||||
| Element elem = (Element)child; | |||||
| if ("cov.data".equals(elem.getNodeName())){ | |||||
| return elem; | |||||
| } | |||||
| } | |||||
| } | |||||
| throw new NoSuchElementException("Could not find 'cov.data' element in parent '" + parent.getNodeName() + "'"); | |||||
| } | |||||
| protected Hashtable getMethods(Element clazz){ | |||||
| Hashtable map = new Hashtable(); | |||||
| NodeList children = clazz.getChildNodes(); | |||||
| int len = children.getLength(); | |||||
| for (int i = 0; i < len; i++){ | |||||
| Node child = children.item(i); | |||||
| if (child.getNodeType() == Node.ELEMENT_NODE){ | |||||
| Element elem = (Element)child; | |||||
| if ("method".equals(elem.getNodeName())){ | |||||
| String name = elem.getAttribute("name"); | |||||
| map.put(name, elem); | |||||
| } | |||||
| } | |||||
| } | |||||
| return map; | |||||
| } | |||||
| protected Element[] getClasses(Element pkg){ | |||||
| Vector v = new Vector(); | |||||
| NodeList children = pkg.getChildNodes(); | |||||
| int len = children.getLength(); | |||||
| for (int i = 0; i < len; i++){ | |||||
| Node child = children.item(i); | |||||
| if (child.getNodeType() == Node.ELEMENT_NODE){ | |||||
| Element elem = (Element)child; | |||||
| if ("class".equals(elem.getNodeName())){ | |||||
| v.addElement(elem); | |||||
| } | |||||
| } | |||||
| } | |||||
| Element[] elems = new Element[v.size()]; | |||||
| v.copyInto(elems); | |||||
| return elems; | |||||
| } | |||||
| protected Element[] getPackages(Element snapshot){ | |||||
| Vector v = new Vector(); | |||||
| NodeList children = snapshot.getChildNodes(); | |||||
| int len = children.getLength(); | |||||
| for (int i = 0; i < len; i++){ | |||||
| Node child = children.item(i); | |||||
| if (child.getNodeType() == Node.ELEMENT_NODE){ | |||||
| Element elem = (Element)child; | |||||
| if ("package".equals(elem.getNodeName())){ | |||||
| v.addElement(elem); | |||||
| } | |||||
| } | |||||
| } | |||||
| Element[] elems = new Element[v.size()]; | |||||
| v.copyInto(elems); | |||||
| return elems; | |||||
| } | |||||
| private static DocumentBuilder newBuilder() { | |||||
| try { | |||||
| DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); | |||||
| factory.setIgnoringComments(true); | |||||
| factory.setValidating(false); | |||||
| return factory.newDocumentBuilder(); | |||||
| } catch (Exception e){ | |||||
| throw new ExceptionInInitializerError(e); | |||||
| } | |||||
| } | |||||
| public void log(String message){ | |||||
| if (task == null){ | |||||
| //System.out.println(message); | |||||
| } else { | |||||
| task.log(message, Project.MSG_DEBUG); | |||||
| } | |||||
| } | |||||
| public static void main(String[] args) throws Exception { | |||||
| File reportFile = new File( XMLReport.class.getResource("covreport-test.xml").getFile() ); | |||||
| XMLReport report = new XMLReport( reportFile ); | |||||
| report.setJProbehome(new File("d:/Program Files/JProbe")); | |||||
| ReportFilters filters = new ReportFilters(); | |||||
| ReportFilters.Include incl = new ReportFilters.Include(); | |||||
| incl.setClass("*"); | |||||
| incl.setMethod("set*"); | |||||
| filters.addInclude(incl); | |||||
| report.setReportFilters(filters); | |||||
| Document doc = report.createDocument( new String[]{"Z:/imediation/ichannel/sources/toolkit/lib/imtoolkit.jar"} ); | |||||
| TransformerFactory tfactory = TransformerFactory.newInstance(); | |||||
| Transformer transformer = tfactory.newTransformer(); | |||||
| transformer.setOutputProperty(OutputKeys.INDENT, "yes"); | |||||
| transformer.setOutputProperty(OutputKeys.METHOD, "xml"); | |||||
| transformer.transform(new DOMSource(doc), new StreamResult( new FileOutputStream( "d:/tmp/snapshot_merge.xml"))); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,200 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.ConstantPool; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.ClassCPInfo; | |||||
| import org.apache.tools.ant.taskdefs.optional.sitraka.bytecode.attributes.*; | |||||
| /** | |||||
| * Object representing a class. | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class ClassFile { | |||||
| protected ConstantPool constantPool; | |||||
| protected InterfaceList interfaces; | |||||
| protected FieldInfoList fields; | |||||
| protected MethodInfoList methods; | |||||
| protected String sourceDir; | |||||
| protected String sourceFile; | |||||
| protected int access_flags; | |||||
| protected int this_class; | |||||
| protected int super_class; | |||||
| protected boolean isSynthetic; | |||||
| protected boolean isDeprecated; | |||||
| public ClassFile(InputStream is) throws IOException { | |||||
| DataInputStream dis = new DataInputStream(is); | |||||
| constantPool = new ConstantPool(); | |||||
| int magic = dis.readInt(); // 0xCAFEBABE | |||||
| int minor = dis.readShort(); | |||||
| int major = dis.readShort(); | |||||
| constantPool.read(dis); | |||||
| constantPool.resolve(); | |||||
| access_flags = dis.readShort(); | |||||
| this_class = dis.readShort(); | |||||
| super_class = dis.readShort(); | |||||
| interfaces = new InterfaceList(constantPool); | |||||
| interfaces.read(dis); | |||||
| //System.out.println(interfaces.toString()); | |||||
| fields = new FieldInfoList(constantPool); | |||||
| fields.read(dis); | |||||
| //System.out.println(fields.toString()); | |||||
| methods = new MethodInfoList(constantPool); | |||||
| methods.read(dis); | |||||
| //System.out.println(methods.toString()); | |||||
| AttributeInfoList attributes = new AttributeInfoList(constantPool); | |||||
| attributes.read(dis); | |||||
| SourceFile srcFile = (SourceFile)attributes.getAttribute(AttributeInfo.SOURCE_FILE); | |||||
| if (srcFile != null){ | |||||
| sourceFile = srcFile.getValue(); | |||||
| } | |||||
| SourceDir srcDir = (SourceDir)attributes.getAttribute(AttributeInfo.SOURCE_DIR); | |||||
| if (srcDir != null){ | |||||
| sourceDir = srcDir.getValue(); | |||||
| } | |||||
| isSynthetic = attributes.getAttribute(AttributeInfo.SYNTHETIC) != null; | |||||
| isDeprecated = attributes.getAttribute(AttributeInfo.DEPRECATED) != null; | |||||
| } | |||||
| public int getAccess(){ | |||||
| return access_flags; | |||||
| } | |||||
| public InterfaceList getInterfaces(){ | |||||
| return interfaces; | |||||
| } | |||||
| public String getSourceFile(){ | |||||
| return sourceFile; | |||||
| } | |||||
| public String getSourceDir(){ | |||||
| return sourceDir; | |||||
| } | |||||
| public boolean isSynthetic() { | |||||
| return isSynthetic; | |||||
| } | |||||
| public boolean isDeprecated() { | |||||
| return isDeprecated; | |||||
| } | |||||
| public MethodInfoList getMethods(){ | |||||
| return methods; | |||||
| } | |||||
| public FieldInfoList getFields(){ | |||||
| return fields; | |||||
| } | |||||
| public String getSuperName(){ | |||||
| return Utils.getUTF8Value(constantPool, super_class); | |||||
| } | |||||
| public String getFullName(){ | |||||
| return ((ClassCPInfo)constantPool.getEntry(this_class)).getClassName().replace('/','.'); | |||||
| } | |||||
| public String getName(){ | |||||
| String name = getFullName(); | |||||
| int pos = name.lastIndexOf('.'); | |||||
| if (pos == -1){ | |||||
| return ""; | |||||
| } | |||||
| return name.substring(pos + 1); | |||||
| } | |||||
| public String getPackage(){ | |||||
| String name = getFullName(); | |||||
| int pos = name.lastIndexOf('.'); | |||||
| if (pos == -1){ | |||||
| return ""; | |||||
| } | |||||
| return name.substring(0, pos); | |||||
| } | |||||
| /** dirty test method, move it into a testcase */ | |||||
| public static void main(String[] args) throws Exception { | |||||
| System.out.println("loading classfile..."); | |||||
| InputStream is = ClassLoader.getSystemResourceAsStream("java/util/Vector.class"); | |||||
| ClassFile clazzfile = new ClassFile(is); | |||||
| System.out.println("Class name: " + clazzfile.getName()); | |||||
| MethodInfoList methods = clazzfile.getMethods(); | |||||
| for (int i = 0; i < methods.length(); i++){ | |||||
| MethodInfo method = methods.getMethod(i); | |||||
| System.out.println("Method: " + method.getFullSignature()); | |||||
| System.out.println("line: " + method.getNumberOfLines()); | |||||
| LineNumberTable lnt = method.getCode().getLineNumberTable(); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,351 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode; | |||||
| import java.io.*; | |||||
| import java.util.*; | |||||
| import java.util.zip.*; | |||||
| /** | |||||
| * Core of the bytecode analyzer. It loads classes from a given classpath. | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class ClassPathLoader { | |||||
| public final static FileLoader NULL_LOADER = new NullLoader(); | |||||
| /** the list of files to look for */ | |||||
| protected File[] files; | |||||
| /** | |||||
| * create a new instance with a given classpath. It must be urls | |||||
| * separated by the platform specific path separator. | |||||
| * @param classPath the classpath to load all the classes from. | |||||
| */ | |||||
| public ClassPathLoader(String classPath){ | |||||
| StringTokenizer st = new StringTokenizer(classPath, File.pathSeparator); | |||||
| Vector entries = new Vector(); | |||||
| while (st.hasMoreTokens()){ | |||||
| File file = new File(st.nextToken()); | |||||
| entries.addElement(file); | |||||
| } | |||||
| files = new File[entries.size()]; | |||||
| entries.copyInto(files); | |||||
| } | |||||
| /** | |||||
| * create a new instance with a given set of urls. | |||||
| * @param entries valid file urls (either .jar, .zip or directory) | |||||
| */ | |||||
| public ClassPathLoader(String[] entries){ | |||||
| files = new File[entries.length]; | |||||
| for (int i = 0; i < entries.length; i++){ | |||||
| files[i] = new File(entries[i]); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * create a new instance with a given set of urls | |||||
| * @param entries file urls to look for classes (.jar, .zip or directory) | |||||
| */ | |||||
| public ClassPathLoader(File[] entries){ | |||||
| files = entries; | |||||
| } | |||||
| /** the interface to implement to look up for specific resources */ | |||||
| public interface FileLoader { | |||||
| /** the file url that is looked for .class files */ | |||||
| public File getFile(); | |||||
| /** return the set of classes found in the file */ | |||||
| public ClassFile[] getClasses() throws IOException; | |||||
| } | |||||
| /** | |||||
| * @return the set of <tt>FileLoader</tt> loaders matching the given classpath. | |||||
| */ | |||||
| public Enumeration loaders(){ | |||||
| return new LoaderEnumeration(); | |||||
| } | |||||
| /** | |||||
| * return the whole set of classes in the classpath. Note that this method | |||||
| * can be very resource demanding since it must load all bytecode from | |||||
| * all classes in all resources in the classpath at a time. | |||||
| * To process it in a less resource demanding way, it is maybe better to | |||||
| * use the <tt>loaders()</tt> that will return loader one by one. | |||||
| * | |||||
| * @return the hashtable containing ALL classes that are found in the given | |||||
| * classpath. Note that the first entry of a given classname will shadow | |||||
| * classes with the same name (as a classloader does) | |||||
| */ | |||||
| public Hashtable getClasses() throws IOException { | |||||
| Hashtable map = new Hashtable(); | |||||
| Enumeration enum = loaders(); | |||||
| while ( enum.hasMoreElements() ){ | |||||
| FileLoader loader = (FileLoader)enum.nextElement(); | |||||
| System.out.println("Processing " + loader.getFile()); | |||||
| long t0 = System.currentTimeMillis(); | |||||
| ClassFile[] classes = loader.getClasses(); | |||||
| long dt = System.currentTimeMillis() - t0; | |||||
| System.out.println("" + classes.length + " loaded in " + dt + "ms"); | |||||
| for (int j = 0; j < classes.length; j++){ | |||||
| String name = classes[j].getName(); | |||||
| // do not allow duplicates entries to preserve 'classpath' behavior | |||||
| // first class in wins | |||||
| if ( !map.contains(name) ){ | |||||
| map.put(name, classes[j]); | |||||
| } | |||||
| } | |||||
| } | |||||
| return map; | |||||
| } | |||||
| /** dirty little test, should be moved to a testcase */ | |||||
| public static void main(String[] args) throws Exception { | |||||
| ClassPathLoader cl = new ClassPathLoader("e:/jdk/jdk1.3.1/lib/tools.jar;e:/jdk/jdk1.3.1/jre/lib/rt.jar"); | |||||
| Hashtable map = cl.getClasses(); | |||||
| System.out.println("Loaded classes: " + map.size()); | |||||
| } | |||||
| /** the loader enumeration that will return loaders */ | |||||
| protected class LoaderEnumeration implements Enumeration { | |||||
| protected int index = 0; | |||||
| public boolean hasMoreElements(){ | |||||
| return index < files.length; | |||||
| } | |||||
| public Object nextElement(){ | |||||
| if (index >= files.length){ | |||||
| throw new NoSuchElementException(); | |||||
| } | |||||
| File file = files[index++]; | |||||
| if ( !file.exists() ){ | |||||
| return new NullLoader(file); | |||||
| } | |||||
| if ( file.isDirectory() ){ | |||||
| // it's a directory | |||||
| return new DirectoryLoader(file); | |||||
| } else if ( file.getName().endsWith(".zip") || file.getName().endsWith(".jar") ){ | |||||
| // it's a jar/zip file | |||||
| return new JarLoader(file); | |||||
| } | |||||
| return new NullLoader(file); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * useful methods to read the whole input stream in memory so that | |||||
| * it can be accessed faster. Processing rt.jar and tools.jar from JDK 1.3.1 | |||||
| * brings time from 50s to 7s. | |||||
| */ | |||||
| public static InputStream getCachedStream(InputStream is) throws IOException { | |||||
| is = new BufferedInputStream(is); | |||||
| byte[] buffer = new byte[8192]; | |||||
| ByteArrayOutputStream baos = new ByteArrayOutputStream(2048); | |||||
| int n; | |||||
| baos.reset(); | |||||
| while ((n = is.read(buffer, 0, buffer.length)) != -1) { | |||||
| baos.write(buffer, 0, n); | |||||
| } | |||||
| is.close(); | |||||
| return new ByteArrayInputStream(baos.toByteArray()); | |||||
| } | |||||
| } | |||||
| /** a null loader to return when the file is not valid */ | |||||
| class NullLoader implements ClassPathLoader.FileLoader { | |||||
| private File file; | |||||
| NullLoader(){ | |||||
| this(null); | |||||
| } | |||||
| NullLoader(File file){ | |||||
| this.file = file; | |||||
| } | |||||
| public File getFile(){ | |||||
| return file; | |||||
| } | |||||
| public ClassFile[] getClasses() throws IOException { | |||||
| return new ClassFile[0]; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * jar loader specified in looking for classes in jar and zip | |||||
| * @todo read the jar manifest in case there is a Class-Path | |||||
| * entry. | |||||
| */ | |||||
| class JarLoader implements ClassPathLoader.FileLoader { | |||||
| private File file; | |||||
| JarLoader(File file){ | |||||
| this.file = file; | |||||
| } | |||||
| public File getFile(){ | |||||
| return file; | |||||
| } | |||||
| public ClassFile[] getClasses() throws IOException { | |||||
| ZipFile zipFile = new ZipFile(file); | |||||
| Vector v = new Vector(); | |||||
| Enumeration entries = zipFile.entries(); | |||||
| while (entries.hasMoreElements()){ | |||||
| ZipEntry entry = (ZipEntry)entries.nextElement(); | |||||
| if (entry.getName().endsWith(".class")){ | |||||
| InputStream is = ClassPathLoader.getCachedStream(zipFile.getInputStream(entry)); | |||||
| ClassFile classFile = new ClassFile(is); | |||||
| is.close(); | |||||
| v.addElement(classFile); | |||||
| } | |||||
| } | |||||
| ClassFile[] classes = new ClassFile[v.size()]; | |||||
| v.copyInto(classes); | |||||
| return classes; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * directory loader that will look all classes recursively | |||||
| * @todo should discard classes which package name does not | |||||
| * match the directory ? | |||||
| */ | |||||
| class DirectoryLoader implements ClassPathLoader.FileLoader { | |||||
| private File directory; | |||||
| DirectoryLoader(File dir){ | |||||
| directory = dir; | |||||
| } | |||||
| public File getFile(){ | |||||
| return directory; | |||||
| } | |||||
| public ClassFile[] getClasses() throws IOException { | |||||
| Vector v = new Vector(); | |||||
| Vector files = listFiles( directory, new ClassFilter(), true); | |||||
| for (int i = 0; i < files.size(); i++){ | |||||
| File file = (File)files.elementAt(i); | |||||
| InputStream is = null; | |||||
| try { | |||||
| is = ClassPathLoader.getCachedStream(new FileInputStream(file)); | |||||
| ClassFile classFile = new ClassFile(is); | |||||
| is.close(); | |||||
| is = null; | |||||
| v.addElement(classFile); | |||||
| } finally { | |||||
| if (is != null){ | |||||
| try { | |||||
| is.close(); | |||||
| } catch (IOException ignored){} | |||||
| } | |||||
| } | |||||
| } | |||||
| ClassFile[] classes = new ClassFile[v.size()]; | |||||
| v.copyInto(classes); | |||||
| return classes; | |||||
| } | |||||
| /** | |||||
| * List files that obeys to a specific filter recursively from a given base | |||||
| * directory. | |||||
| * @param directory the directory where to list the files from. | |||||
| * @param filter the file filter to apply | |||||
| * @param recurse tells whether or not the listing is recursive. | |||||
| * @return the list of <tt>File</tt> objects that applies to the given | |||||
| * filter. | |||||
| */ | |||||
| public static Vector listFiles(File directory, FilenameFilter filter, boolean recurse){ | |||||
| if (!directory.isDirectory()){ | |||||
| throw new IllegalArgumentException(directory + " is not a directory"); | |||||
| } | |||||
| Vector list = new Vector(); | |||||
| listFilesTo(list, directory, filter, recurse); | |||||
| return list; | |||||
| } | |||||
| /** | |||||
| * List and add files to a given list. As a convenience it sends back the | |||||
| * instance of the list given as a parameter. | |||||
| * @param list the list of files where the filtered files should be added | |||||
| * @param directory the directory where to list the files from. | |||||
| * @param filter the file filter to apply | |||||
| * @param recurse tells whether or not the listing is recursive. | |||||
| * @return the list instance that was passed as the <tt>list</tt> argument. | |||||
| */ | |||||
| private static Vector listFilesTo(Vector list, File directory, FilenameFilter filter, boolean recurse){ | |||||
| String[] files = directory.list(filter); | |||||
| for (int i = 0; i < files.length; i++){ | |||||
| list.addElement( new File(directory, files[i]) ); | |||||
| } | |||||
| files = null; // we don't need it anymore | |||||
| if (recurse){ | |||||
| String[] subdirs = directory.list( new DirectoryFilter() ); | |||||
| for (int i = 0; i < subdirs.length; i++){ | |||||
| listFilesTo(list, new File(directory, subdirs[i]), filter, recurse); | |||||
| } | |||||
| } | |||||
| return list; | |||||
| } | |||||
| } | |||||
| /** Convenient filter that accepts only directory <tt>File</tt> */ | |||||
| class DirectoryFilter implements FilenameFilter { | |||||
| public boolean accept(File directory, String name){ | |||||
| File pathname = new File(directory, name); | |||||
| return pathname.isDirectory(); | |||||
| } | |||||
| } | |||||
| /** convenient filter to accept only .class files */ | |||||
| class ClassFilter implements FilenameFilter { | |||||
| public boolean accept(File dir, String name){ | |||||
| return name.endsWith(".class"); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,132 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.ConstantPool; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.Utf8CPInfo; | |||||
| import org.apache.tools.ant.taskdefs.optional.sitraka.bytecode.attributes.*; | |||||
| /** | |||||
| * field structure | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class FieldInfo { | |||||
| protected ConstantPool constantPool; | |||||
| protected int access_flags; | |||||
| protected int name_index; | |||||
| protected int descriptor_index; | |||||
| protected AttributeInfoList attributes; | |||||
| protected boolean synthetic; | |||||
| protected boolean deprecated; | |||||
| protected boolean constant; | |||||
| public FieldInfo(ConstantPool pool){ | |||||
| constantPool = pool; | |||||
| } | |||||
| public void read(DataInputStream dis) throws IOException { | |||||
| access_flags = dis.readShort(); | |||||
| name_index = dis.readShort(); | |||||
| descriptor_index = dis.readShort(); | |||||
| attributes = new AttributeInfoList(constantPool); | |||||
| attributes.read(dis); | |||||
| constant = attributes.getAttribute(AttributeInfo.CONSTANT_VALUE) != null; | |||||
| deprecated = attributes.getAttribute(AttributeInfo.DEPRECATED) != null; | |||||
| synthetic = attributes.getAttribute(AttributeInfo.SYNTHETIC) != null; | |||||
| } | |||||
| public int getAccessFlags(){ | |||||
| return access_flags; | |||||
| } | |||||
| public String getName(){ | |||||
| return Utils.getUTF8Value(constantPool, name_index); | |||||
| } | |||||
| public String getDescriptor(){ | |||||
| return Utils.getUTF8Value(constantPool, descriptor_index); | |||||
| } | |||||
| public boolean isDeprecated(){ | |||||
| return deprecated; | |||||
| } | |||||
| public boolean isSynthetic(){ | |||||
| return synthetic; | |||||
| } | |||||
| public boolean isConstant(){ | |||||
| return constant; | |||||
| } | |||||
| public String getAccess(){ | |||||
| return Utils.getFieldAccess(access_flags); | |||||
| } | |||||
| public String toString(){ | |||||
| StringBuffer sb = new StringBuffer(); | |||||
| sb.append("Field: "); | |||||
| sb.append(getAccess()).append(" "); | |||||
| Utils.descriptor2java(getDescriptor(),0,sb); | |||||
| sb.append(" ").append(getName()); | |||||
| return sb.toString(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,106 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.ConstantPool; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.Utf8CPInfo; | |||||
| /** | |||||
| * field structure list | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class FieldInfoList { | |||||
| protected ConstantPool constantPool; | |||||
| protected FieldInfo[] fields; | |||||
| public FieldInfoList(ConstantPool pool){ | |||||
| constantPool = pool; | |||||
| } | |||||
| public void read(DataInputStream dis) throws IOException { | |||||
| int numFields = dis.readShort(); | |||||
| fields = new FieldInfo[numFields]; | |||||
| for (int i = 0; i < fields.length; i++){ | |||||
| fields[i] = new FieldInfo(constantPool); | |||||
| fields[i].read(dis); | |||||
| } | |||||
| } | |||||
| public String getFieldName(int index){ | |||||
| return getField(index).getName(); | |||||
| } | |||||
| public FieldInfo getField(int index){ | |||||
| return fields[index]; | |||||
| } | |||||
| public int length(){ | |||||
| return fields.length; | |||||
| } | |||||
| public String toString(){ | |||||
| StringBuffer sb = new StringBuffer(); | |||||
| sb.append("Fields: ").append(fields.length).append("\n"); | |||||
| for (int i = 0; i < fields.length; i++){ | |||||
| sb.append("\t"); | |||||
| sb.append(getField(i).toString()); | |||||
| } | |||||
| return sb.toString(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,105 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.*; | |||||
| /** | |||||
| * list of interfaces implemented in a class. | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class InterfaceList { | |||||
| protected ConstantPool constantPool; | |||||
| protected int[] interfaces; | |||||
| public InterfaceList(ConstantPool pool){ | |||||
| constantPool = pool; | |||||
| } | |||||
| public void read(DataInputStream dis) throws IOException { | |||||
| int count = dis.readShort(); | |||||
| interfaces = new int[count]; | |||||
| for (int i = 0; i < count; i++){ | |||||
| interfaces[i] = dis.readShort(); | |||||
| } | |||||
| } | |||||
| public int length(){ | |||||
| return interfaces.length; | |||||
| } | |||||
| public String getInterface(int i){ | |||||
| int index = interfaces[i]; | |||||
| ClassCPInfo cp = (ClassCPInfo)constantPool.getEntry(index); | |||||
| return cp.getClassName().replace('/','.'); | |||||
| } | |||||
| public String[] getInterfaces(){ | |||||
| String[] classes = new String[interfaces.length]; | |||||
| for (int i = 0; i < classes.length; i++){ | |||||
| classes[i] = getInterface(i); | |||||
| } | |||||
| return classes; | |||||
| } | |||||
| public String toString(){ | |||||
| StringBuffer sb = new StringBuffer("Interfaces: "); | |||||
| String[] names = getInterfaces(); | |||||
| for (int i = 0; i < names.length; i++){ | |||||
| sb.append(names[i]); | |||||
| if (i != names.length - 1){ | |||||
| sb.append(", "); | |||||
| } | |||||
| } | |||||
| return sb.toString(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,167 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.sitraka.bytecode.attributes.*; | |||||
| /** | |||||
| * Method info structure. | |||||
| * @todo give a more appropriate name to methods. | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class MethodInfo { | |||||
| protected ConstantPool constantPool; | |||||
| protected int access_flags; | |||||
| protected int name_index; | |||||
| protected int descriptor_index; | |||||
| protected Code code; | |||||
| protected boolean deprecated; | |||||
| protected boolean synthetic; | |||||
| protected Exceptions exceptions; | |||||
| public MethodInfo(ConstantPool pool){ | |||||
| constantPool = pool; | |||||
| } | |||||
| public void read(DataInputStream dis) throws IOException { | |||||
| access_flags = dis.readShort(); | |||||
| name_index = dis.readShort(); | |||||
| descriptor_index = dis.readShort(); | |||||
| AttributeInfoList attrlist = new AttributeInfoList(constantPool); | |||||
| attrlist.read(dis); | |||||
| code = (Code)attrlist.getAttribute(AttributeInfo.CODE); | |||||
| synthetic = attrlist.getAttribute(AttributeInfo.SYNTHETIC) != null; | |||||
| deprecated = attrlist.getAttribute(AttributeInfo.DEPRECATED) != null; | |||||
| exceptions = (Exceptions)attrlist.getAttribute(AttributeInfo.EXCEPTIONS); | |||||
| } | |||||
| public int getAccessFlags(){ | |||||
| return access_flags; | |||||
| } | |||||
| public String getName(){ | |||||
| return Utils.getUTF8Value(constantPool, name_index); | |||||
| } | |||||
| public String getDescriptor(){ | |||||
| return Utils.getUTF8Value(constantPool, descriptor_index); | |||||
| } | |||||
| public String getFullSignature(){ | |||||
| return getReturnType() + " " + getShortSignature(); | |||||
| } | |||||
| public String getShortSignature(){ | |||||
| StringBuffer buf = new StringBuffer(getName()); | |||||
| buf.append("("); | |||||
| String[] params = getParametersType(); | |||||
| for (int i = 0; i < params.length; i++){ | |||||
| buf.append(params[i]); | |||||
| if (i != params.length - 1){ | |||||
| buf.append(", "); | |||||
| } | |||||
| } | |||||
| buf.append(")"); | |||||
| return buf.toString(); | |||||
| } | |||||
| public String getReturnType(){ | |||||
| return Utils.getMethodReturnType(getDescriptor()); | |||||
| } | |||||
| public String[] getParametersType(){ | |||||
| return Utils.getMethodParams(getDescriptor()); | |||||
| } | |||||
| public Code getCode(){ | |||||
| return code; | |||||
| } | |||||
| public int getNumberOfLines(){ | |||||
| int len = -1; | |||||
| if (code != null){ | |||||
| LineNumberTable lnt = code.getLineNumberTable(); | |||||
| if (lnt != null){ | |||||
| len = lnt.length(); | |||||
| } | |||||
| } | |||||
| return len; | |||||
| } | |||||
| public boolean isDeprecated(){ | |||||
| return deprecated; | |||||
| } | |||||
| public boolean isSynthetic(){ | |||||
| return synthetic; | |||||
| } | |||||
| public String getAccess(){ | |||||
| return Utils.getMethodAccess(access_flags); | |||||
| } | |||||
| public String toString(){ | |||||
| StringBuffer sb = new StringBuffer(); | |||||
| sb.append("Method: ").append(getAccess()).append(" "); | |||||
| sb.append(getFullSignature()); | |||||
| sb.append(" synthetic:").append(synthetic); | |||||
| sb.append(" deprecated:").append(deprecated); | |||||
| return sb.toString(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,119 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.ConstantPool; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.Utf8CPInfo; | |||||
| /** | |||||
| * A list of method_info structures. | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class MethodInfoList { | |||||
| /** pool containing all the information */ | |||||
| protected ConstantPool constantPool; | |||||
| /** methods in this list */ | |||||
| protected MethodInfo[] methods; | |||||
| public MethodInfoList(ConstantPool pool){ | |||||
| constantPool = pool; | |||||
| } | |||||
| /** read the bytecode from the stream */ | |||||
| public void read(DataInputStream dis) throws IOException { | |||||
| int count = dis.readShort(); | |||||
| methods = new MethodInfo[count]; | |||||
| for (int i = 0; i < count; i++){ | |||||
| methods[i] = new MethodInfo(constantPool); | |||||
| methods[i].read(dis); | |||||
| } | |||||
| } | |||||
| /** the size of the list */ | |||||
| public int length(){ | |||||
| return methods.length; | |||||
| } | |||||
| /** | |||||
| * get a method in the list. | |||||
| * @param i the index of the method to retrieve | |||||
| * @return the method matching the index. | |||||
| */ | |||||
| public MethodInfo getMethod(int i){ | |||||
| return methods[i]; | |||||
| } | |||||
| /** | |||||
| * return the set of methods in this list. Mostly as a debugging purpose. | |||||
| */ | |||||
| public String toString(){ | |||||
| StringBuffer sb = new StringBuffer(); | |||||
| sb.append("Methods: ").append(methods.length).append("\n"); | |||||
| for (int i = 0; i < methods.length; i++){ | |||||
| sb.append("\t"); | |||||
| sb.append(getMethod(i).toString()); | |||||
| sb.append("\n"); | |||||
| } | |||||
| return sb.toString(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,385 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.*; | |||||
| import java.util.Vector; | |||||
| /** | |||||
| * Utilities mostly to manipulate methods and access flags. | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class Utils { | |||||
| /** public access flag */ | |||||
| public static final short ACC_PUBLIC = 1; | |||||
| /** private access flag */ | |||||
| public static final short ACC_PRIVATE = 2; | |||||
| /** protected access flag */ | |||||
| public static final short ACC_PROTECTED = 4; | |||||
| /** static access flag */ | |||||
| public static final short ACC_STATIC = 8; | |||||
| /** final access flag */ | |||||
| public static final short ACC_FINAL = 16; | |||||
| /** super access flag */ | |||||
| public static final short ACC_SUPER = 32; | |||||
| /** synchronized access flag */ | |||||
| public static final short ACC_SYNCHRONIZED = 32; | |||||
| /** volatile access flag */ | |||||
| public static final short ACC_VOLATILE = 64; | |||||
| /** transient access flag */ | |||||
| public static final short ACC_TRANSIENT = 128; | |||||
| /** native access flag */ | |||||
| public static final short ACC_NATIVE = 256; | |||||
| /** interface access flag */ | |||||
| public static final short ACC_INTERFACE = 512; | |||||
| /** abstract access flag */ | |||||
| public static final short ACC_ABSTRACT = 1024; | |||||
| /** strict access flag */ | |||||
| public static final short ACC_STRICT = 2048; | |||||
| /** private constructor */ | |||||
| private Utils(){ | |||||
| } | |||||
| /** | |||||
| * return an UTF8 value from the pool located a a specific index. | |||||
| * @param pool the constant pool to look at | |||||
| * @param index index of the UTF8 value in the constant pool | |||||
| * @return the value of the string if it exists | |||||
| * @throws ClassCastException if the index is not an UTF8 constant. | |||||
| */ | |||||
| public static String getUTF8Value(ConstantPool pool, int index){ | |||||
| return ((Utf8CPInfo)pool.getEntry(index)).getValue(); | |||||
| } | |||||
| /** | |||||
| * parse all parameters from a descritor into fields of java name. | |||||
| * @param descriptor of a method. | |||||
| * @return the parameter list of a given method descriptor. Each string | |||||
| * represent a java object with its fully qualified classname or the | |||||
| * primitive name such as int, long, ... | |||||
| */ | |||||
| public static String[] getMethodParams(String descriptor){ | |||||
| int i = 0; | |||||
| if (descriptor.charAt(i) != '('){ | |||||
| throw new IllegalArgumentException("Method descriptor should start with a '('"); | |||||
| } | |||||
| Vector params = new Vector(); | |||||
| StringBuffer param = new StringBuffer(); | |||||
| i++; | |||||
| while ( (i = descriptor2java(descriptor, i, param)) < descriptor.length() ){ | |||||
| params.add(param.toString()); | |||||
| param.setLength(0); // reset | |||||
| if (descriptor.charAt(i) == ')'){ | |||||
| i++; | |||||
| break; | |||||
| } | |||||
| } | |||||
| String[] array = new String[params.size()]; | |||||
| params.copyInto(array); | |||||
| return array; | |||||
| } | |||||
| /** | |||||
| * return the object type of a return type. | |||||
| * @param descriptor | |||||
| * @return get the return type objet of a given descriptor | |||||
| */ | |||||
| public static String getMethodReturnType(String descriptor){ | |||||
| int pos = descriptor.indexOf(')'); | |||||
| StringBuffer rettype = new StringBuffer(); | |||||
| descriptor2java(descriptor, pos + 1, rettype); | |||||
| return rettype.toString(); | |||||
| } | |||||
| /** | |||||
| * Parse a single descriptor symbol and returns it java equivalent. | |||||
| * @param descriptor the descriptor symbol. | |||||
| * @param i the index to look at the symbol in the descriptor string | |||||
| * @param sb the stringbuffer to return the java equivalent of the symbol | |||||
| * @return the index after the descriptor symbol | |||||
| */ | |||||
| public static int descriptor2java(String descriptor, int i, StringBuffer sb){ | |||||
| // get the dimension | |||||
| StringBuffer dim = new StringBuffer(); | |||||
| for (;descriptor.charAt(i) == '['; i++){ | |||||
| dim.append("[]"); | |||||
| } | |||||
| // now get the type | |||||
| switch (descriptor.charAt(i)){ | |||||
| case 'B': sb.append("byte"); break; | |||||
| case 'C': sb.append("char"); break; | |||||
| case 'D': sb.append("double"); break; | |||||
| case 'F': sb.append("float"); break; | |||||
| case 'I': sb.append("int"); break; | |||||
| case 'J': sb.append("long"); break; | |||||
| case 'S': sb.append("short"); break; | |||||
| case 'Z': sb.append("boolean"); break; | |||||
| case 'V': sb.append("void"); break; | |||||
| case 'L': | |||||
| // it is a class | |||||
| int pos = descriptor.indexOf(';', i + 1); | |||||
| String classname = descriptor.substring(i + 1, pos).replace('/', '.'); | |||||
| sb.append(classname); | |||||
| i = pos; | |||||
| break; | |||||
| default: | |||||
| //@todo, yeah this happens because I got things like: | |||||
| // ()Ljava/lang/Object; and it will return and ) will be here | |||||
| // think about it. | |||||
| //ooooops should never happen | |||||
| //throw new IllegalArgumentException("Invalid descriptor symbol: '" + i + "' in '" + descriptor + "'"); | |||||
| } | |||||
| sb.append(dim.toString()); | |||||
| return ++i; | |||||
| } | |||||
| /** | |||||
| * check for abstract access | |||||
| * @param access_flags access flags | |||||
| */ | |||||
| public static boolean isAbstract(int access_flags) { | |||||
| return (access_flags & ACC_ABSTRACT) != 0; | |||||
| } | |||||
| /** | |||||
| * check for public access | |||||
| * @param access_flags access flags | |||||
| */ | |||||
| public static boolean isPublic(int access_flags) { | |||||
| return (access_flags & ACC_PUBLIC) != 0; | |||||
| } | |||||
| /** | |||||
| * check for a static access | |||||
| * @param access_flags access flags | |||||
| */ | |||||
| public static boolean isStatic(int access_flags) { | |||||
| return (access_flags & ACC_STATIC) != 0; | |||||
| } | |||||
| /** | |||||
| * check for native access | |||||
| * @param access_flags access flags | |||||
| */ | |||||
| public static boolean isNative(int access_flags) { | |||||
| return (access_flags & ACC_NATIVE) != 0; | |||||
| } | |||||
| /** | |||||
| * check for class access | |||||
| * @param access_flags access flags | |||||
| */ | |||||
| public static boolean isClass(int access_flags) { | |||||
| return !isInterface(access_flags); | |||||
| } | |||||
| /** | |||||
| * check for strict access | |||||
| * @param access_flags access flags | |||||
| */ | |||||
| public static boolean isStrict(int access_flags) { | |||||
| return (access_flags & ACC_STRICT) != 0; | |||||
| } | |||||
| /** | |||||
| * check for interface access | |||||
| * @param access_flags access flags | |||||
| */ | |||||
| public static boolean isInterface(int access_flags) { | |||||
| return (access_flags & ACC_INTERFACE) != 0; | |||||
| } | |||||
| /** | |||||
| * check for private access | |||||
| * @param access_flags access flags | |||||
| */ | |||||
| public static boolean isPrivate(int access_flags) { | |||||
| return (access_flags & ACC_PRIVATE) != 0; | |||||
| } | |||||
| /** | |||||
| * check for transient flag | |||||
| * @param access_flags access flags | |||||
| */ | |||||
| public static boolean isTransient(int access_flags) { | |||||
| return (access_flags & ACC_TRANSIENT) != 0; | |||||
| } | |||||
| /** | |||||
| * check for volatile flag | |||||
| * @param access_flags access flags | |||||
| */ | |||||
| public static boolean isVolatile(int access_flags){ | |||||
| return (access_flags & ACC_VOLATILE) != 0; | |||||
| } | |||||
| /** | |||||
| * check for super flag | |||||
| * @param access_flags access flag | |||||
| */ | |||||
| public static boolean isSuper(int access_flags) { | |||||
| return (access_flags & ACC_SUPER) != 0; | |||||
| } | |||||
| /** | |||||
| * check for protected flag | |||||
| * @param access_flags access flags | |||||
| */ | |||||
| public static boolean isProtected(int access_flags) { | |||||
| return (access_flags & ACC_PROTECTED) != 0; | |||||
| } | |||||
| /** | |||||
| * chck for final flag | |||||
| * @param access_flags access flags | |||||
| */ | |||||
| public static boolean isFinal(int access_flags) { | |||||
| return (access_flags & ACC_FINAL) != 0; | |||||
| } | |||||
| /** | |||||
| * check for synchronized flag | |||||
| * @param access_flags access flags | |||||
| */ | |||||
| public static boolean isSynchronized(int access_flags) { | |||||
| return (access_flags & ACC_SYNCHRONIZED) != 0; | |||||
| } | |||||
| /** | |||||
| * return the method access flag as java modifiers | |||||
| * @param access_flags access flags | |||||
| * @return the access flags as modifier strings | |||||
| */ | |||||
| public static String getMethodAccess(int access_flags) { | |||||
| StringBuffer sb = new StringBuffer(); | |||||
| if(isPublic(access_flags)){ | |||||
| sb.append("public "); | |||||
| } else if(isPrivate(access_flags)){ | |||||
| sb.append("private "); | |||||
| } else if(isProtected(access_flags)){ | |||||
| sb.append("protected "); | |||||
| } | |||||
| if(isFinal(access_flags)){ | |||||
| sb.append("final "); | |||||
| } | |||||
| if(isStatic(access_flags)){ | |||||
| sb.append("static "); | |||||
| } | |||||
| if(isSynchronized(access_flags)){ | |||||
| sb.append("synchronized "); | |||||
| } | |||||
| if(isNative(access_flags)){ | |||||
| sb.append("native "); | |||||
| } | |||||
| if(isAbstract(access_flags)){ | |||||
| sb.append("abstract "); | |||||
| } | |||||
| return sb.toString().trim(); | |||||
| } | |||||
| /** | |||||
| * return the field access flag as java modifiers | |||||
| * @param access_flags access flags | |||||
| * @return the access flags as modifier strings | |||||
| */ | |||||
| public static String getFieldAccess(int access_flags) { | |||||
| StringBuffer sb = new StringBuffer(); | |||||
| if(isPublic(access_flags)){ | |||||
| sb.append("public "); | |||||
| } else if(isPrivate(access_flags)){ | |||||
| sb.append("private "); | |||||
| } else if (isProtected(access_flags)){ | |||||
| sb.append("protected "); | |||||
| } | |||||
| if(isFinal(access_flags)){ | |||||
| sb.append("final "); | |||||
| } | |||||
| if(isStatic(access_flags)){ | |||||
| sb.append("static "); | |||||
| } | |||||
| if(isVolatile(access_flags)){ | |||||
| sb.append("volatile "); | |||||
| } | |||||
| if(isTransient(access_flags)){ | |||||
| sb.append("transient "); | |||||
| } | |||||
| return sb.toString().trim(); | |||||
| } | |||||
| /** | |||||
| * return the class access flag as java modifiers | |||||
| * @param access_flags access flags | |||||
| * @return the access flags as modifier strings | |||||
| */ | |||||
| public static String getClassAccess(int access_flags) { | |||||
| StringBuffer sb = new StringBuffer(); | |||||
| if(isPublic(access_flags)){ | |||||
| sb.append("public "); | |||||
| } else if (isProtected(access_flags)){ | |||||
| sb.append("protected "); | |||||
| } else if (isPrivate(access_flags)){ | |||||
| sb.append("private "); | |||||
| } | |||||
| if(isFinal(access_flags)){ | |||||
| sb.append("final "); | |||||
| } | |||||
| if(isSuper(access_flags)){ | |||||
| sb.append("/*super*/ "); | |||||
| } | |||||
| if(isInterface(access_flags)){ | |||||
| sb.append("interface "); | |||||
| } | |||||
| if(isAbstract(access_flags)){ | |||||
| sb.append("abstract "); | |||||
| } | |||||
| if(isClass(access_flags)){ | |||||
| sb.append("class "); | |||||
| } | |||||
| return sb.toString().trim(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,146 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode.attributes; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.sitraka.bytecode.*; | |||||
| /** | |||||
| * Attribute info structure that provides base methods | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public abstract class AttributeInfo { | |||||
| public final static String SOURCE_FILE = "SourceFile"; | |||||
| public final static String CONSTANT_VALUE = "ConstantValue"; | |||||
| public final static String CODE = "Code"; | |||||
| public final static String EXCEPTIONS = "Exceptions"; | |||||
| public final static String LINE_NUMBER_TABLE = "LineNumberTable"; | |||||
| public final static String LOCAL_VARIABLE_TABLE = "LocalVariableTable"; | |||||
| public final static String INNER_CLASSES = "InnerClasses"; | |||||
| public final static String SOURCE_DIR = "SourceDir"; | |||||
| public final static String SYNTHETIC = "Synthetic"; | |||||
| public final static String DEPRECATED = "Deprecated"; | |||||
| public final static String UNKNOWN = "Unknown"; | |||||
| protected int name_index; | |||||
| protected ConstantPool constantPool; | |||||
| protected AttributeInfo(int attr_index, ConstantPool pool){ | |||||
| name_index = attr_index; | |||||
| constantPool = pool; | |||||
| } | |||||
| /** | |||||
| * @param dis | |||||
| * @throws IOException | |||||
| */ | |||||
| protected void read(DataInputStream dis) throws IOException { | |||||
| int len = dis.readInt(); | |||||
| dis.skipBytes(len); | |||||
| } | |||||
| public String getName(){ | |||||
| return Utils.getUTF8Value(constantPool, name_index); | |||||
| } | |||||
| /** | |||||
| * @param attr_index | |||||
| * @param dis | |||||
| * @param pool | |||||
| */ | |||||
| public static AttributeInfo newAttribute(int attr_index, DataInputStream dis, ConstantPool pool) throws IOException { | |||||
| AttributeInfo attr = null; | |||||
| final String name = Utils.getUTF8Value(pool, attr_index); | |||||
| if (SOURCE_FILE.equals(name)){ | |||||
| attr = new SourceFile(attr_index, pool); | |||||
| } else if (CONSTANT_VALUE.equals(name)){ | |||||
| attr = new ConstantValue(attr_index, pool); | |||||
| } else if (CODE.equals(name)){ | |||||
| attr = new Code(attr_index, pool); | |||||
| } else if (EXCEPTIONS.equals(name)){ | |||||
| attr = new Exceptions(attr_index, pool); | |||||
| } else if (LINE_NUMBER_TABLE.equals(name)){ | |||||
| attr = new LineNumberTable(attr_index, pool); | |||||
| } else if (LOCAL_VARIABLE_TABLE.equals(name)){ | |||||
| attr = new LocalVariableTable(attr_index, pool); | |||||
| } else if (INNER_CLASSES.equals(name)){ | |||||
| attr = new InnerClasses(attr_index, pool); | |||||
| } else if (SOURCE_DIR.equals(name)){ | |||||
| attr = new SourceDir(attr_index, pool); | |||||
| } else if (SYNTHETIC.equals(name)){ | |||||
| attr = new Synthetic(attr_index, pool); | |||||
| } else if (DEPRECATED.equals(name)){ | |||||
| attr = new Deprecated(attr_index, pool); | |||||
| } else { | |||||
| attr = new Unknown(attr_index, pool); | |||||
| } | |||||
| attr.read(dis); | |||||
| return attr; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,102 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode.attributes; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.ConstantPool; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.Utf8CPInfo; | |||||
| /** | |||||
| * list of attributes | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class AttributeInfoList { | |||||
| protected AttributeInfo[] attributes; | |||||
| protected ConstantPool constantPool; | |||||
| public AttributeInfoList(ConstantPool pool){ | |||||
| constantPool = pool; | |||||
| } | |||||
| public void read(DataInputStream dis) throws IOException { | |||||
| final int attributes_count = dis.readUnsignedShort(); | |||||
| attributes = new AttributeInfo[attributes_count]; | |||||
| for (int i = 0; i < attributes_count; i++){ | |||||
| int attr_id = dis.readShort(); | |||||
| attributes[i] = AttributeInfo.newAttribute(attr_id, dis, constantPool); | |||||
| } | |||||
| } | |||||
| public AttributeInfo[] getAttributes(){ | |||||
| return attributes; | |||||
| } | |||||
| public AttributeInfo getAttribute(String name){ | |||||
| for (int i = 0; i < attributes.length; i++){ | |||||
| if (name.equals(attributes[i].getName())){ | |||||
| return attributes[i]; | |||||
| } | |||||
| } | |||||
| return null; | |||||
| } | |||||
| public int size(){ | |||||
| return attributes.length; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,160 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode.attributes; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.ConstantPool; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.Utf8CPInfo; | |||||
| /** | |||||
| * Code structure. | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class Code extends AttributeInfo { | |||||
| protected int length; | |||||
| protected int max_stack; | |||||
| protected int max_locals; | |||||
| protected byte[] code; | |||||
| protected ExceptionInfo[] exceptions; | |||||
| protected LineNumberTable lineNumberTable; | |||||
| public Code(int attr_index, ConstantPool pool){ | |||||
| super(attr_index, pool); | |||||
| } | |||||
| public void read(DataInputStream dis) throws IOException { | |||||
| length = dis.readInt(); | |||||
| max_stack = dis.readShort(); | |||||
| max_locals = dis.readShort(); | |||||
| // read bytecode... | |||||
| int bytecode_len = dis.readInt(); | |||||
| //code = new byte[bytecode_len]; | |||||
| //dis.readFully(code); | |||||
| dis.skip(bytecode_len); | |||||
| // read exceptions... | |||||
| int exception_count = dis.readShort(); | |||||
| exceptions = new ExceptionInfo[exception_count]; | |||||
| for (int i = 0; i < exception_count; i++){ | |||||
| exceptions[i] = new ExceptionInfo(constantPool); | |||||
| exceptions[i].read(dis); | |||||
| } | |||||
| // read attributes... | |||||
| AttributeInfoList attributes = new AttributeInfoList(constantPool); | |||||
| attributes.read(dis); | |||||
| lineNumberTable = (LineNumberTable)attributes.getAttribute(AttributeInfo.LINE_NUMBER_TABLE); | |||||
| } | |||||
| public int getMaxStack(){ | |||||
| return max_stack; | |||||
| } | |||||
| public int getMaxLocals(){ | |||||
| return max_locals; | |||||
| } | |||||
| public byte[] getCode(){ | |||||
| return code; | |||||
| } | |||||
| public ExceptionInfo[] getExceptions(){ | |||||
| return exceptions; | |||||
| } | |||||
| public LineNumberTable getLineNumberTable(){ | |||||
| return lineNumberTable; | |||||
| } | |||||
| public static class ExceptionInfo { | |||||
| protected ConstantPool constantPool; | |||||
| protected int startPC; | |||||
| protected int endPC; | |||||
| protected int handlerPC; | |||||
| protected int catchType; | |||||
| public ExceptionInfo(ConstantPool pool){ | |||||
| constantPool = pool; | |||||
| } | |||||
| public void read(DataInputStream dis) throws IOException { | |||||
| startPC = dis.readShort(); | |||||
| endPC = dis.readShort(); | |||||
| handlerPC = dis.readShort(); | |||||
| catchType = dis.readShort(); | |||||
| } | |||||
| public int getStartPC(){ | |||||
| return startPC; | |||||
| } | |||||
| public int getEndPC(){ | |||||
| return endPC; | |||||
| } | |||||
| public int getHandlerPC(){ | |||||
| return handlerPC; | |||||
| } | |||||
| public int getCatchType(){ | |||||
| return catchType; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,85 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode.attributes; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.ConstantPool; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.Utf8CPInfo; | |||||
| /** | |||||
| * constant value structure | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class ConstantValue extends AttributeInfo { | |||||
| protected int name_index; | |||||
| public ConstantValue(int attr_index, ConstantPool pool){ | |||||
| super(attr_index, pool); | |||||
| } | |||||
| protected void read(DataInputStream dis) throws IOException { | |||||
| int len = dis.readInt(); // assert 2 == len : len | |||||
| if (len != 2){ | |||||
| throw new IllegalStateException("Constant value length should be 2 but was " + len); | |||||
| } | |||||
| name_index = dis.readShort(); | |||||
| } | |||||
| public String getValue(){ | |||||
| return ((Utf8CPInfo)constantPool.getEntry(name_index)).getValue(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,70 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode.attributes; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.ConstantPool; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.Utf8CPInfo; | |||||
| /** | |||||
| * deprecated structure | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class Deprecated extends AttributeInfo { | |||||
| public Deprecated(int attr_index, ConstantPool pool){ | |||||
| super(attr_index, pool); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,71 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode.attributes; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.ConstantPool; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.Utf8CPInfo; | |||||
| /** | |||||
| * exceptions structure | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class Exceptions extends AttributeInfo { | |||||
| public Exceptions(int attr_index, ConstantPool pool){ | |||||
| super(attr_index, pool); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,72 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode.attributes; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.ConstantPool; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.Utf8CPInfo; | |||||
| /** | |||||
| * inner classes structure | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class InnerClasses extends AttributeInfo { | |||||
| public InnerClasses(int attr_index, ConstantPool pool){ | |||||
| super(attr_index, pool); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,97 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode.attributes; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.ConstantPool; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.Utf8CPInfo; | |||||
| /** | |||||
| * line number table structure | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class LineNumberTable extends AttributeInfo { | |||||
| protected int count; | |||||
| protected int[] varTable; | |||||
| public LineNumberTable(int attr_index, ConstantPool pool){ | |||||
| super(attr_index, pool); | |||||
| } | |||||
| protected void read(DataInputStream dis) throws IOException { | |||||
| int len = dis.readInt(); | |||||
| count = dis.readShort(); | |||||
| varTable = new int[ count * 2 ]; | |||||
| for (int i = 0; i < varTable.length; i++){ | |||||
| varTable[i] = dis.readShort(); | |||||
| } | |||||
| } | |||||
| public int getStartPC(int i){ | |||||
| return varTable[2*i]; | |||||
| } | |||||
| public int getLineNumber(int i){ | |||||
| return varTable[2*i + 1]; | |||||
| } | |||||
| public int length(){ | |||||
| return count; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,105 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode.attributes; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.ConstantPool; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.Utf8CPInfo; | |||||
| /** | |||||
| * local variable table. | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class LocalVariableTable extends AttributeInfo { | |||||
| protected int count; | |||||
| protected int[] varTable; | |||||
| public LocalVariableTable(int attr_index, ConstantPool pool){ | |||||
| super(attr_index, pool); | |||||
| } | |||||
| protected void read(DataInputStream dis) throws IOException { | |||||
| int len = dis.readInt(); | |||||
| count = dis.readShort(); | |||||
| varTable = new int[count * 5]; | |||||
| for (int i = 0; i < varTable.length; i++){ | |||||
| varTable[i] = dis.readShort(); | |||||
| } | |||||
| } | |||||
| public int getStartPC(int index){ | |||||
| return varTable[5*index]; | |||||
| } | |||||
| public int getEndPC(int index){ | |||||
| return varTable[5*index] + varTable[5*index + 1]; | |||||
| } | |||||
| public String getVariableName(int index){ | |||||
| int i = varTable[5*index + 2]; | |||||
| return ((Utf8CPInfo)constantPool.getEntry(i)).getValue(); | |||||
| } | |||||
| public String getType(int index){ | |||||
| int i = varTable[5*index + 3]; | |||||
| return ((Utf8CPInfo)constantPool.getEntry(i)).getValue(); | |||||
| } | |||||
| public int getSlot(int index){ | |||||
| return varTable[5*index + 4]; | |||||
| } | |||||
| public int length(){ | |||||
| return count; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,84 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode.attributes; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.ConstantPool; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.Utf8CPInfo; | |||||
| /** | |||||
| * source directory structure. | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class SourceDir extends AttributeInfo { | |||||
| protected int name_index; | |||||
| public SourceDir(int attr_index, ConstantPool pool){ | |||||
| super(attr_index, pool); | |||||
| } | |||||
| protected void read(DataInputStream dis) throws IOException { | |||||
| int len = dis.readInt(); | |||||
| // assert len == 2 | |||||
| name_index = dis.readShort(); | |||||
| } | |||||
| public String getValue(){ | |||||
| return ((Utf8CPInfo)constantPool.getEntry(name_index)).getValue(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,84 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode.attributes; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.ConstantPool; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.Utf8CPInfo; | |||||
| /** | |||||
| * source file structure | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class SourceFile extends AttributeInfo { | |||||
| protected int name_index; | |||||
| public SourceFile(int attr_index, ConstantPool pool){ | |||||
| super(attr_index, pool); | |||||
| } | |||||
| protected void read(DataInputStream dis) throws IOException { | |||||
| int len = dis.readInt(); | |||||
| // assert len == 2 | |||||
| name_index = dis.readShort(); | |||||
| } | |||||
| public String getValue(){ | |||||
| return ((Utf8CPInfo)constantPool.getEntry(name_index)).getValue(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,70 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode.attributes; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.ConstantPool; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.Utf8CPInfo; | |||||
| /** | |||||
| * synthetic structure | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class Synthetic extends AttributeInfo { | |||||
| public Synthetic(int attr_index, ConstantPool pool){ | |||||
| super(attr_index, pool); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,69 @@ | |||||
| /* | |||||
| * 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 acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" 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" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.sitraka.bytecode.attributes; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.taskdefs.optional.depend.constantpool.ConstantPool; | |||||
| /** | |||||
| * unknown structure attribute | |||||
| * | |||||
| * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a> | |||||
| */ | |||||
| public class Unknown extends AttributeInfo { | |||||
| public Unknown(int attr_index, ConstantPool pool){ | |||||
| super(attr_index, pool); | |||||
| } | |||||
| } | |||||