static public void start (InvarContext ctx, String suffix) throws Throwable
    {
        InvarReadRule.suffix = suffix;
        File file = new File(ctx.getRuleDir());
        log("Rule Path: " + file.getAbsolutePath());
        if (!file.exists())
            return;
        FilenameFilter filter = new FilenameFilter()
        {
            @Override
            public boolean accept (File dir, String name)
            {
                File f = new File(dir, name);
                if (f.getName().startsWith("."))
                    return false;
                if (f.getName().startsWith("_"))
                    return false;
                if (f.isDirectory())
                    return true;
                if (name.endsWith(InvarReadRule.suffix))
                    return true;
                return false;
            }
        };
        List<File> files = new ArrayList<File>();
        recursiveReadFile(files, file, filter);
        List<InvarReadRule> xmls = new ArrayList<InvarReadRule>();
        for (File f : files)
        {
            Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
            if (!doc.hasChildNodes())
                return;
            log("read  <- " + f.getAbsolutePath());
            InvarReadRule read = new InvarReadRule(ctx, f.getAbsolutePath());
            read.build(doc);
            xmls.add(read);
        }
        for (InvarReadRule x : xmls)
        {
            x.parse();
        }
    }