    import soot.Body;
    import soot.Main;
    import soot.Pack;
    import soot.PackManager;
    import soot.Transform;
    import soot.Unit;

    import soot.tagkit.StringTag;

    import soot.toolkits.scalar.ArraySparseSet;
    import soot.toolkits.graph.BriefUnitGraph;

    public class NullnessDriver
    {
        public static void main(String[] argv)
        {
            Pack jtp = soot.G.v().PackManager().getPack("jtp");
            jtp.add(new Transform("jtp.nt", new NullTransformer()));
            jtp.add(new Transform("jtp.nac", new NullnessAnalysisColorer()));

            soot.Main.main(argv);
        }
    }

    class NullTransformer extends soot.BodyTransformer
    {
        protected void internalTransform(Body b, String phaseName,
                                         java.util.Map options)
        {
            NullnessAnalysis na = new NullnessAnalysis(new BriefUnitGraph(b));

            java.util.Iterator uIt = b.getUnits().iterator();
            while (uIt.hasNext())
            {
                Unit u = (Unit)uIt.next();

                StringBuffer n = new StringBuffer();
                u.addTag(new StringTag("IN: "+na.getFlowBefore(u).toString()));

                if (u.fallsThrough())
                {
                    ArraySparseSet s = (ArraySparseSet)na.getFallFlowAfter(u);
                    u.addTag(new StringTag("FALL: "+s.toString()));
                }
                if (u.branches())
                {
                    ArraySparseSet t = (ArraySparseSet)na.
                        getBranchFlowAfter(u).get(0);
                    u.addTag(new StringTag("BRANCH: "+t.toString()));
                }
            }
        }
    }