com.ibm.wala.shrikeBT.tools
Class OfflineInstrumenterBase

java.lang.Object
  extended by com.ibm.wala.shrikeBT.tools.OfflineInstrumenterBase
Direct Known Subclasses:
OfflineInstrumenter

public abstract class OfflineInstrumenterBase
extends java.lang.Object

This class provides functionality for performing offline instrumentation. It is subclassed with class-toolkit-specific functionality.


Nested Class Summary
static interface OfflineInstrumenterBase.ManifestBuilder
          Thiscallback is notified whenever an entry has been added to the output zip file.
 
Constructor Summary
protected OfflineInstrumenterBase()
           
 
Method Summary
 void addInputClass(java.io.File f)
          Add a class file containing a source class to instrument.
 void addInputDirectory(java.io.File d)
          Add a directory containing class files to instrument.
 boolean addInputElement(java.lang.String a)
          Add something to instrument --- the name of a JAR file, a class file, a directory or an entry within a jar file (as filename#entryname).
 void addInputJar(java.io.File f)
          Add a JAR file containing source classes to instrument.
 void addInputJarEntry(java.io.File f, java.lang.String name)
          Add a JAR entry containing a source class to instrument.
 java.io.OutputStream addOutputJarEntry(java.util.zip.ZipEntry ze)
          Add a raw ZipEntry to the output JAR.
 void beginTraversal()
          Start traversing the source class list from the beginning.
 void close()
          Call this when you're done modifying classes.
static void copyStream(java.io.InputStream in, java.io.OutputStream out)
           
 void endOutputJarEntry()
          Complete and flush the entry initiated by addOutputJarEntry.
protected abstract  java.lang.String getClassName(java.lang.Object cl)
           
 java.lang.String getLastClassResourceName()
          Get the name of the resource containing the last class returned.
 int getNumInputClasses()
           
 java.io.File getOutputFile()
          Returns the File we are storing classes into.
protected  java.lang.Object internalNextClass()
           
protected  boolean internalOutputModifiedClass(java.lang.Object cf, java.lang.Object mods)
           
protected abstract  java.lang.Object makeClassFromStream(java.io.BufferedInputStream s)
           
 java.lang.String[] parseStandardArgs(java.lang.String[] args)
          Parse an argument list to find elements to instrument and the name of the output file.
 void readInputClasses(java.io.InputStream s)
          Read a list of class file names from a stream and add them to the list of things to instrument.
 void setIgnore(boolean ignore)
          Skip the last class returned in every future traversal of the class list.
 void setJARComment(java.lang.String comment)
          Set the JAR Comment for the output JAR.
 void setManifestBuilder(OfflineInstrumenterBase.ManifestBuilder mb)
          This installs a ManifestBuilder callback that this class will notify whenever an entry has been added to the output zip file.
 void setOutputJar(java.io.File f)
          Set the file in which instrumented classes will be deposited.
 void setPassUnmodifiedClasses(boolean pass)
          Indicate whether classes which are not modified will be put into the output jar anyway.
protected abstract  void writeClassTo(java.lang.Object cl, java.lang.Object mods, java.io.OutputStream s)
           
 void writeUnmodifiedClasses()
          Call this to copy any unmodified classes to the output.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

OfflineInstrumenterBase

protected OfflineInstrumenterBase()
Method Detail

setManifestBuilder

public void setManifestBuilder(OfflineInstrumenterBase.ManifestBuilder mb)
This installs a ManifestBuilder callback that this class will notify whenever an entry has been added to the output zip file.


setOutputJar

public final void setOutputJar(java.io.File f)
Set the file in which instrumented classes will be deposited.


setPassUnmodifiedClasses

public final void setPassUnmodifiedClasses(boolean pass)
Indicate whether classes which are not modified will be put into the output jar anyway.


addInputJar

public final void addInputJar(java.io.File f)
                       throws java.io.IOException
Add a JAR file containing source classes to instrument.

Throws:
java.io.IOException

addInputJarEntry

public final void addInputJarEntry(java.io.File f,
                                   java.lang.String name)
                            throws java.io.IOException
Add a JAR entry containing a source class to instrument.

Throws:
java.io.IOException

addInputClass

public final void addInputClass(java.io.File f)
Add a class file containing a source class to instrument.


addInputDirectory

public final void addInputDirectory(java.io.File d)
                             throws java.io.IOException,
                                    java.lang.IllegalArgumentException
Add a directory containing class files to instrument. All subdirectories are also scanned.

Throws:
java.lang.IllegalArgumentException - if d is null
java.io.IOException

addInputElement

public final boolean addInputElement(java.lang.String a)
                              throws java.io.IOException
Add something to instrument --- the name of a JAR file, a class file, a directory or an entry within a jar file (as filename#entryname). If we can't identify it, nothing is added and we return false.

Throws:
java.lang.IllegalArgumentException - if a is null
java.io.IOException

parseStandardArgs

public final java.lang.String[] parseStandardArgs(java.lang.String[] args)
                                           throws java.lang.IllegalArgumentException,
                                                  java.io.IOException
Parse an argument list to find elements to instrument and the name of the output file. The "-o filename" option selects the output JAR file name. Any other argument not starting with "-" is added to the list of elements to instrument, if it appears to be the name of a class file, JAR file, or directory. If any argument starting with "--" is encountered, the rest of the command-line is considered leftover

Returns:
the arguments that were not understood
Throws:
java.lang.IllegalArgumentException - if args == null
java.io.IOException

getNumInputClasses

public final int getNumInputClasses()
Returns:
the number of source classes to be instrumented

readInputClasses

public final void readInputClasses(java.io.InputStream s)
                            throws java.io.IOException,
                                   java.lang.IllegalArgumentException
Read a list of class file names from a stream and add them to the list of things to instrument.

Throws:
java.io.IOException
java.lang.IllegalArgumentException

beginTraversal

public final void beginTraversal()
Start traversing the source class list from the beginning.


makeClassFromStream

protected abstract java.lang.Object makeClassFromStream(java.io.BufferedInputStream s)
                                                 throws java.io.IOException
Throws:
java.io.IOException

getClassName

protected abstract java.lang.String getClassName(java.lang.Object cl)

writeClassTo

protected abstract void writeClassTo(java.lang.Object cl,
                                     java.lang.Object mods,
                                     java.io.OutputStream s)
                              throws java.io.IOException
Throws:
java.io.IOException

internalNextClass

protected final java.lang.Object internalNextClass()
                                            throws java.io.IOException
Throws:
java.io.IOException

getLastClassResourceName

public final java.lang.String getLastClassResourceName()
Get the name of the resource containing the last class returned. This is either a file name (e.g., "com/ibm/Main.class"), or a JAR entry name (e.g., "apps/app.jar#com/ibm/Main.class").

Returns:
the resource name, or null if no class has been returned yet

getOutputFile

public final java.io.File getOutputFile()
Returns the File we are storing classes into.


internalOutputModifiedClass

protected final boolean internalOutputModifiedClass(java.lang.Object cf,
                                                    java.lang.Object mods)
                                             throws java.io.IOException
Throws:
java.io.IOException

setJARComment

public final void setJARComment(java.lang.String comment)
                         throws java.io.IOException,
                                java.lang.IllegalStateException
Set the JAR Comment for the output JAR.

Throws:
java.io.IOException
java.lang.IllegalStateException

setIgnore

public final void setIgnore(boolean ignore)
                     throws java.lang.IllegalArgumentException
Skip the last class returned in every future traversal of the class list.

Throws:
java.lang.IllegalArgumentException

copyStream

public static void copyStream(java.io.InputStream in,
                              java.io.OutputStream out)
                       throws java.lang.IllegalArgumentException,
                              java.io.IOException
Throws:
java.lang.IllegalArgumentException
java.io.IOException

addOutputJarEntry

public final java.io.OutputStream addOutputJarEntry(java.util.zip.ZipEntry ze)
                                             throws java.io.IOException,
                                                    java.lang.IllegalStateException
Add a raw ZipEntry to the output JAR. Call endOutputJarEntry() when you're done.

Returns:
the OutputStream to be used to write the entry contents
Throws:
java.io.IOException
java.lang.IllegalStateException

endOutputJarEntry

public final void endOutputJarEntry()
                             throws java.io.IOException,
                                    java.lang.IllegalStateException
Complete and flush the entry initiated by addOutputJarEntry.

Throws:
java.io.IOException
java.lang.IllegalStateException

writeUnmodifiedClasses

public final void writeUnmodifiedClasses()
                                  throws java.io.IOException,
                                         java.lang.IllegalStateException
Call this to copy any unmodified classes to the output. This is called automatically by close(); you should only call this if you want to write an entry to the JAR file *after* the unmodified classes. This will only ever be called once per output JAR.

Throws:
java.io.IOException
java.lang.IllegalStateException

close

public final void close()
                 throws java.io.IOException,
                        java.lang.IllegalStateException
Call this when you're done modifying classes.

Throws:
java.io.IOException
java.lang.IllegalStateException