class JarAnalyzer extends FileAnalyzer {

    private static final String[] UNSTORED_FIELD_NAMES = new String[]
            {QueryBuilder.FULL, QueryBuilder.REFS};

    protected JarAnalyzer(AnalyzerFactory factory) {
        super(factory);
    }

    /**
     * @return {@code null} as there is no aligned language
     */
    @Override
    public String getCtagsLang() {
        return null;
    }

    /**
     * Gets a version number to be used to tag processed documents so that
     * re-analysis can be re-done later if a stored version number is different
     * from the current implementation.
     * @return 20180612_00
     */
    @Override
    protected int getSpecializedVersionNo() {
        return 20180612_00; // Edit comment above too!
    }

    @Override
    public void analyze(Document doc, StreamSource src, Writer xrefOut) throws IOException {<FILL_FUNCTION_BODY>}
}

        JFieldBuilder jfbuilder = new JFieldBuilder();
        try (ZipInputStream zis = new ZipInputStream(src.getStream())) {
            ZipEntry entry;
            while ((entry = zis.getNextEntry()) != null) {
                String ename = entry.getName();

                if (xrefOut != null) {
                    xrefOut.append("<br/><b>");
                    Util.htmlize(ename, xrefOut);
                    xrefOut.append("</b>");
                }

                StringWriter fout = jfbuilder.write(QueryBuilder.FULL);
                fout.write(ename);
                fout.write("\n");

                AnalyzerFactory fac = AnalyzerGuru.find(ename);
                if (fac instanceof JavaClassAnalyzerFactory) {
                    if (xrefOut != null) {
                        xrefOut.append("<br/>");
                    }
                    JavaClassAnalyzer jca =
                            (JavaClassAnalyzer) fac.getAnalyzer();
                    jca.analyze(doc, new BufferedInputStream(zis), xrefOut,
                            jfbuilder);
                }
            }
        }

        for (String name : UNSTORED_FIELD_NAMES) {
            if (jfbuilder.hasField(name)) {
                String fstr = jfbuilder.write(name).toString();
                doc.add(new OGKTextField(name, fstr, Store.NO));
            }
        }
        String name = QueryBuilder.DEFS;
        if (jfbuilder.hasField(name)) {
            String fstr = jfbuilder.write(name).toString();
            doc.add(new OGKTextVecField(name, fstr, Store.NO));
        }
    
<methods>public void <init>(org.opengrok.indexer.analysis.AnalyzerFactory) ,public void analyze(Document, org.opengrok.indexer.analysis.StreamSource, java.io.Writer) throws java.io.IOException, java.lang.InterruptedException,public java.lang.String getCtagsLang() ,public java.lang.String getFileTypeName() ,public final long getVersionNo() ,public org.opengrok.indexer.analysis.Xrefer writeXref(org.opengrok.indexer.analysis.WriteXrefArgs) throws java.io.IOException<variables>private static final java.util.logging.Logger LOGGER