All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.enhydra.xml.xmlc.deferredparsing.DynamicMLCreatorASM2Impl Maven / Gradle / Ivy

The newest version!
package org.enhydra.xml.xmlc.deferredparsing;

import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;

public class DynamicMLCreatorASM2Impl implements Opcodes, DynamicMLCreator {

    private String className;
    private String LclassName;
    private String LclassNameV;
    private String sourcePath;
    private String superClass;
    private String implInterfaces[];
    private String mimeType;
    private String encoding;

    public byte[] getByteArrayForClass() {
        byte[] ret = null;
        try {
            ret = dump();
        } catch (Exception e) {
            ;
        }
        return ret;
    }

    public DynamicMLCreatorASM2Impl(String name, String path) {
        className = name.replace('.', '/');
        LclassName = "L" + className + ";";
        LclassNameV = "(" + LclassName + ")V";
        sourcePath = path;
        String type = (path.endsWith(".html") || path.endsWith(".htm") || path.endsWith(".xhtml") || path
                .endsWith(".chtml")) ? "html" : "xml";
        if (type.equals("html")) {
            // xhtml is actually xml, but generated xhtml classes look like
            // this rather than the xml below, so including xhtml for this
            // definition
            superClass = "org/enhydra/xml/xmlc/html/HTMLObjectImpl";
            implInterfaces = new String[] { "org/enhydra/xml/xmlc/XMLObject", "org/enhydra/xml/xmlc/html/HTMLObject" };
            mimeType = "text/html";
            encoding = "ISO-8859-1";
        } else {
            superClass = "org/enhydra/xml/xmlc/XMLObjectImpl";
            implInterfaces = new String[] { "org/enhydra/xml/xmlc/XMLObject" };
            mimeType = "text/xml";
            encoding = "UTF-8";
        }
    }

    private byte[] dump() throws Exception {
        ClassWriter cw = new ClassWriter(false);
        FieldVisitor fv;
        MethodVisitor mv;
        cw.visit(V1_2, ACC_PUBLIC + ACC_SUPER, className, null, superClass, implInterfaces);
        cw.visitSource("", null);
        {
            fv = cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC, "XMLC_GENERATED_CLASS", "Ljava/lang/Class;", null,
                    null);
            fv.visitEnd();
        }
        {
            fv = cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC, "XMLC_SOURCE_FILE", "Ljava/lang/String;", null,
                    sourcePath);
            fv.visitEnd();
        }
        {
            fv = cw.visitField(ACC_PRIVATE + ACC_FINAL + ACC_STATIC, "fDOMFactory",
                    "Lorg/enhydra/xml/xmlc/dom/XMLCDomFactory;", null, null);
            fv.visitEnd();
        }
        {
            fv = cw.visitField(ACC_PRIVATE + ACC_FINAL, "fDocumentLoader",
                    "Lorg/enhydra/xml/xmlc/deferredparsing/DocumentLoader;", null, null);
            fv.visitEnd();
        }
        {
            fv = cw.visitField(ACC_STATIC + ACC_SYNTHETIC, "class$0", "Ljava/lang/Class;", null, null);
            fv.visitEnd();
        }
        {
            fv = cw.visitField(ACC_STATIC + ACC_SYNTHETIC, "class$1", "Ljava/lang/Class;", null, null);
            fv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_STATIC, "", "()V", null, null);
            mv.visitCode();
            Label l0 = new Label();
            mv.visitLabel(l0);
            mv.visitLineNumber(22, l0);
            mv.visitFieldInsn(GETSTATIC, className, "class$0", "Ljava/lang/Class;");
            mv.visitInsn(DUP);
            Label l1 = new Label();
            mv.visitJumpInsn(IFNONNULL, l1);
            mv.visitInsn(POP);
            Label l2 = new Label();
            mv.visitLabel(l2);
            mv.visitLdcInsn(className.replace('/', '.'));
            mv.visitMethodInsn(INVOKESTATIC, "java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;");
            Label l3 = new Label();
            mv.visitLabel(l3);
            mv.visitInsn(DUP);
            mv.visitFieldInsn(PUTSTATIC, className, "class$0", "Ljava/lang/Class;");
            mv.visitJumpInsn(GOTO, l1);
            Label l4 = new Label();
            mv.visitLabel(l4);
            mv.visitTypeInsn(NEW, "java/lang/NoClassDefFoundError");
            mv.visitInsn(DUP_X1);
            mv.visitInsn(SWAP);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Throwable", "getMessage", "()Ljava/lang/String;");
            mv.visitMethodInsn(INVOKESPECIAL, "java/lang/NoClassDefFoundError", "", "(Ljava/lang/String;)V");
            mv.visitInsn(ATHROW);
            mv.visitLabel(l1);
            mv.visitFieldInsn(PUTSTATIC, className, "XMLC_GENERATED_CLASS", "Ljava/lang/Class;");
            Label l5 = new Label();
            mv.visitLabel(l5);
            mv.visitLineNumber(33, l5);
            mv.visitFieldInsn(GETSTATIC, className, "class$1", "Ljava/lang/Class;");
            mv.visitInsn(DUP);
            Label l6 = new Label();
            mv.visitJumpInsn(IFNONNULL, l6);
            mv.visitInsn(POP);
            Label l7 = new Label();
            mv.visitLabel(l7);
            mv.visitLdcInsn("org.enhydra.xml.xmlc.dom.xerces.XercesHTMLDomFactory");
            mv.visitMethodInsn(INVOKESTATIC, "java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;");
            Label l8 = new Label();
            mv.visitLabel(l8);
            mv.visitInsn(DUP);
            mv.visitFieldInsn(PUTSTATIC, className, "class$1", "Ljava/lang/Class;");
            mv.visitJumpInsn(GOTO, l6);
            Label l9 = new Label();
            mv.visitLabel(l9);
            mv.visitTypeInsn(NEW, "java/lang/NoClassDefFoundError");
            mv.visitInsn(DUP_X1);
            mv.visitInsn(SWAP);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Throwable", "getMessage", "()Ljava/lang/String;");
            mv.visitMethodInsn(INVOKESPECIAL, "java/lang/NoClassDefFoundError", "", "(Ljava/lang/String;)V");
            mv.visitInsn(ATHROW);
            mv.visitLabel(l6);
            mv.visitMethodInsn(INVOKESTATIC, "org/enhydra/xml/xmlc/dom/XMLCDomFactoryCache", "getFactory",
                    "(Ljava/lang/Class;)Lorg/enhydra/xml/xmlc/dom/XMLCDomFactory;");
            mv.visitFieldInsn(PUTSTATIC, className, "fDOMFactory", "Lorg/enhydra/xml/xmlc/dom/XMLCDomFactory;");
            Label l10 = new Label();
            mv.visitLabel(l10);
            mv.visitLineNumber(17, l10);
            mv.visitInsn(RETURN);
            mv.visitTryCatchBlock(l2, l3, l4, "java/lang/ClassNotFoundException");
            mv.visitTryCatchBlock(l7, l8, l9, "java/lang/ClassNotFoundException");
            mv.visitMaxs(3, 0);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null);
            mv.visitCode();
            Label l0 = new Label();
            mv.visitLabel(l0);
            mv.visitLineNumber(44, l0);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKESTATIC, "org/enhydra/xml/xmlc/deferredparsing/StandardDocumentLoader",
                    "getInstance", "()Lorg/enhydra/xml/xmlc/deferredparsing/DocumentLoader;");
            mv.visitMethodInsn(INVOKESPECIAL, className, "",
                    "(Lorg/enhydra/xml/xmlc/deferredparsing/DocumentLoader;)V");
            Label l1 = new Label();
            mv.visitLabel(l1);
            mv.visitLineNumber(46, l1);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKEVIRTUAL, className, "buildDocument", "()V");
            Label l2 = new Label();
            mv.visitLabel(l2);
            mv.visitLineNumber(48, l2);
            mv.visitInsn(RETURN);
            Label l3 = new Label();
            mv.visitLabel(l3);
            mv.visitLocalVariable("this", LclassName, null, l0, l3, 0);
            mv.visitMaxs(2, 1);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "", "(Z)V", null, null);
            mv.visitCode();
            Label l0 = new Label();
            mv.visitLabel(l0);
            mv.visitLineNumber(54, l0);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKESTATIC, "org/enhydra/xml/xmlc/deferredparsing/StandardDocumentLoader",
                    "getInstance", "()Lorg/enhydra/xml/xmlc/deferredparsing/DocumentLoader;");
            mv.visitVarInsn(ILOAD, 1);
            mv.visitMethodInsn(INVOKESPECIAL, className, "",
                    "(Lorg/enhydra/xml/xmlc/deferredparsing/DocumentLoader;Z)V");
            Label l1 = new Label();
            mv.visitLabel(l1);
            mv.visitLineNumber(56, l1);
            mv.visitInsn(RETURN);
            Label l2 = new Label();
            mv.visitLabel(l2);
            mv.visitLocalVariable("this", LclassName, null, l0, l2, 0);
            mv.visitLocalVariable("buildDOM", "Z", null, l0, l2, 1);
            mv.visitMaxs(3, 2);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "", LclassNameV, null, null);
            mv.visitCode();
            Label l0 = new Label();
            mv.visitLabel(l0);
            mv.visitLineNumber(61, l0);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKESPECIAL, superClass, "", "()V");
            Label l1 = new Label();
            mv.visitLabel(l1);
            mv.visitLineNumber(62, l1);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(ALOAD, 1);
            mv.visitMethodInsn(INVOKEVIRTUAL, className, "getDocumentLoader",
                    "()Lorg/enhydra/xml/xmlc/deferredparsing/DocumentLoader;");
            mv.visitFieldInsn(PUTFIELD, className, "fDocumentLoader",
                    "Lorg/enhydra/xml/xmlc/deferredparsing/DocumentLoader;");
            Label l2 = new Label();
            mv.visitLabel(l2);
            mv.visitLineNumber(64, l2);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(ALOAD, 1);
            mv.visitMethodInsn(INVOKEVIRTUAL, className, "getDocument", "()Lorg/w3c/dom/Document;");
            mv.visitInsn(ICONST_1);
            mv.visitMethodInsn(INVOKEINTERFACE, "org/w3c/dom/Document", "cloneNode", "(Z)Lorg/w3c/dom/Node;");
            mv.visitTypeInsn(CHECKCAST, "org/w3c/dom/Document");
            mv.visitVarInsn(ALOAD, 1);
            mv.visitMethodInsn(INVOKEVIRTUAL, className, "getMIMEType", "()Ljava/lang/String;");
            mv.visitVarInsn(ALOAD, 1);
            mv.visitMethodInsn(INVOKEVIRTUAL, className, "getEncoding", "()Ljava/lang/String;");
            mv.visitMethodInsn(INVOKEVIRTUAL, className, "setDocument",
                    "(Lorg/w3c/dom/Document;Ljava/lang/String;Ljava/lang/String;)V");
            Label l3 = new Label();
            mv.visitLabel(l3);
            mv.visitLineNumber(66, l3);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKEVIRTUAL, className, "syncAccessMethods", "()V");
            Label l4 = new Label();
            mv.visitLabel(l4);
            mv.visitLineNumber(68, l4);
            mv.visitInsn(RETURN);
            Label l5 = new Label();
            mv.visitLabel(l5);
            mv.visitLocalVariable("this", LclassName, null, l0, l5, 0);
            mv.visitLocalVariable("src", LclassName, null, l0, l5, 1);
            mv.visitMaxs(4, 2);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "", "(Lorg/enhydra/xml/xmlc/deferredparsing/DocumentLoader;Z)V",
                    null, null);
            mv.visitCode();
            Label l0 = new Label();
            mv.visitLabel(l0);
            mv.visitLineNumber(75, l0);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKESPECIAL, superClass, "", "()V");
            Label l1 = new Label();
            mv.visitLabel(l1);
            mv.visitLineNumber(77, l1);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(ALOAD, 1);
            mv.visitFieldInsn(PUTFIELD, className, "fDocumentLoader",
                    "Lorg/enhydra/xml/xmlc/deferredparsing/DocumentLoader;");
            Label l2 = new Label();
            mv.visitLabel(l2);
            mv.visitLineNumber(79, l2);
            mv.visitVarInsn(ILOAD, 2);
            Label l3 = new Label();
            mv.visitJumpInsn(IFEQ, l3);
            Label l4 = new Label();
            mv.visitLabel(l4);
            mv.visitLineNumber(81, l4);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKEVIRTUAL, className, "buildDocument", "()V");
            mv.visitLabel(l3);
            mv.visitLineNumber(85, l3);
            mv.visitInsn(RETURN);
            Label l5 = new Label();
            mv.visitLabel(l5);
            mv.visitLocalVariable("this", LclassName, null, l0, l5, 0);
            mv.visitLocalVariable("loader", "Lorg/enhydra/xml/xmlc/deferredparsing/DocumentLoader;", null, l0, l5, 1);
            mv.visitLocalVariable("buildDOM", "Z", null, l0, l5, 2);
            mv.visitMaxs(2, 3);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "", "(Lorg/enhydra/xml/xmlc/deferredparsing/DocumentLoader;)V", null,
                    null);
            mv.visitCode();
            Label l0 = new Label();
            mv.visitLabel(l0);
            mv.visitLineNumber(93, l0);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(ALOAD, 1);
            mv.visitInsn(ICONST_1);
            mv.visitMethodInsn(INVOKESPECIAL, className, "",
                    "(Lorg/enhydra/xml/xmlc/deferredparsing/DocumentLoader;Z)V");
            Label l1 = new Label();
            mv.visitLabel(l1);
            mv.visitLineNumber(95, l1);
            mv.visitInsn(RETURN);
            Label l2 = new Label();
            mv.visitLabel(l2);
            mv.visitLocalVariable("this", LclassName, null, l0, l2, 0);
            mv.visitLocalVariable("loader", "Lorg/enhydra/xml/xmlc/deferredparsing/DocumentLoader;", null, l0, l2, 1);
            mv.visitMaxs(3, 2);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "buildDocument", "()V", null, null);
            mv.visitCode();
            Label l0 = new Label();
            mv.visitLabel(l0);
            mv.visitLineNumber(101, l0);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKEVIRTUAL, className, "getDocumentLoader",
                    "()Lorg/enhydra/xml/xmlc/deferredparsing/DocumentLoader;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;");
            mv.visitMethodInsn(INVOKEINTERFACE, "org/enhydra/xml/xmlc/deferredparsing/DocumentLoader", "getDocument",
                    "(Ljava/lang/Class;)Lorg/w3c/dom/Document;");
            mv.visitLdcInsn(mimeType);
            mv.visitLdcInsn(encoding);
            mv.visitMethodInsn(INVOKEVIRTUAL, className, "setDocument",
                    "(Lorg/w3c/dom/Document;Ljava/lang/String;Ljava/lang/String;)V");
            Label l1 = new Label();
            mv.visitLabel(l1);
            mv.visitLineNumber(103, l1);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKEVIRTUAL, className, "syncAccessMethods", "()V");
            Label l2 = new Label();
            mv.visitLabel(l2);
            mv.visitLineNumber(105, l2);
            mv.visitInsn(RETURN);
            Label l3 = new Label();
            mv.visitLabel(l3);
            mv.visitLocalVariable("this", LclassName, null, l0, l3, 0);
            mv.visitMaxs(4, 1);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "cloneNode", "(Z)Lorg/w3c/dom/Node;", null, null);
            mv.visitCode();
            Label l0 = new Label();
            mv.visitLabel(l0);
            mv.visitLineNumber(111, l0);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(ILOAD, 1);
            mv.visitMethodInsn(INVOKEVIRTUAL, className, "cloneDeepCheck", "(Z)V");
            Label l1 = new Label();
            mv.visitLabel(l1);
            mv.visitLineNumber(113, l1);
            mv.visitTypeInsn(NEW, className);
            mv.visitInsn(DUP);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKESPECIAL, className, "", LclassNameV);
            mv.visitInsn(ARETURN);
            Label l2 = new Label();
            mv.visitLabel(l2);
            mv.visitLocalVariable("this", LclassName, null, l0, l2, 0);
            mv.visitLocalVariable("deep", "Z", null, l0, l2, 1);
            mv.visitMaxs(3, 2);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PROTECTED + ACC_FINAL, "getDocumentLoader",
                    "()Lorg/enhydra/xml/xmlc/deferredparsing/DocumentLoader;", null, null);
            mv.visitCode();
            Label l0 = new Label();
            mv.visitLabel(l0);
            mv.visitLineNumber(121, l0);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, className, "fDocumentLoader",
                    "Lorg/enhydra/xml/xmlc/deferredparsing/DocumentLoader;");
            mv.visitInsn(ARETURN);
            Label l1 = new Label();
            mv.visitLabel(l1);
            mv.visitLocalVariable("this", LclassName, null, l0, l1, 0);
            mv.visitMaxs(1, 1);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PROTECTED + ACC_FINAL, "getDomFactory",
                    "()Lorg/enhydra/xml/xmlc/dom/XMLCDomFactory;", null, null);
            mv.visitCode();
            Label l0 = new Label();
            mv.visitLabel(l0);
            mv.visitLineNumber(129, l0);
            mv.visitFieldInsn(GETSTATIC, className, "fDOMFactory", "Lorg/enhydra/xml/xmlc/dom/XMLCDomFactory;");
            mv.visitInsn(ARETURN);
            Label l1 = new Label();
            mv.visitLabel(l1);
            mv.visitLocalVariable("this", LclassName, null, l0, l1, 0);
            mv.visitMaxs(1, 1);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PROTECTED, "syncWithDocument", "(Lorg/w3c/dom/Node;)V", null, null);
            mv.visitCode();
            Label l0 = new Label();
            mv.visitLabel(l0);
            mv.visitLineNumber(138, l0);
            mv.visitVarInsn(ALOAD, 1);
            mv.visitTypeInsn(INSTANCEOF, "org/w3c/dom/Element");
            Label l1 = new Label();
            mv.visitJumpInsn(IFEQ, l1);
            Label l2 = new Label();
            mv.visitLabel(l2);
            mv.visitLineNumber(140, l2);
            mv.visitVarInsn(ALOAD, 1);
            mv.visitTypeInsn(CHECKCAST, "org/w3c/dom/Element");
            mv.visitLdcInsn("id");
            mv.visitMethodInsn(INVOKEINTERFACE, "org/w3c/dom/Element", "getAttribute",
                    "(Ljava/lang/String;)Ljava/lang/String;");
            mv.visitVarInsn(ASTORE, 2);
            Label l3 = new Label();
            mv.visitLabel(l3);
            mv.visitLineNumber(142, l3);
            mv.visitVarInsn(ALOAD, 2);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "length", "()I");
            mv.visitInsn(POP);
            mv.visitLabel(l1);
            mv.visitLineNumber(148, l1);
            mv.visitVarInsn(ALOAD, 1);
            mv.visitMethodInsn(INVOKEINTERFACE, "org/w3c/dom/Node", "getFirstChild", "()Lorg/w3c/dom/Node;");
            mv.visitVarInsn(ASTORE, 2);
            Label l4 = new Label();
            mv.visitLabel(l4);
            mv.visitLineNumber(150, l4);
            Label l5 = new Label();
            mv.visitJumpInsn(GOTO, l5);
            Label l6 = new Label();
            mv.visitLabel(l6);
            mv.visitLineNumber(152, l6);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(ALOAD, 2);
            mv.visitMethodInsn(INVOKEVIRTUAL, className, "syncWithDocument", "(Lorg/w3c/dom/Node;)V");
            Label l7 = new Label();
            mv.visitLabel(l7);
            mv.visitLineNumber(154, l7);
            mv.visitVarInsn(ALOAD, 2);
            mv.visitMethodInsn(INVOKEINTERFACE, "org/w3c/dom/Node", "getNextSibling", "()Lorg/w3c/dom/Node;");
            mv.visitVarInsn(ASTORE, 2);
            mv.visitLabel(l5);
            mv.visitLineNumber(150, l5);
            mv.visitVarInsn(ALOAD, 2);
            mv.visitJumpInsn(IFNONNULL, l6);
            Label l8 = new Label();
            mv.visitLabel(l8);
            mv.visitLineNumber(158, l8);
            mv.visitInsn(RETURN);
            Label l9 = new Label();
            mv.visitLabel(l9);
            mv.visitLocalVariable("this", LclassName, null, l0, l9, 0);
            mv.visitLocalVariable("node", "Lorg/w3c/dom/Node;", null, l0, l9, 1);
            mv.visitLocalVariable("id", "Ljava/lang/String;", null, l3, l1, 2);
            mv.visitLocalVariable("child", "Lorg/w3c/dom/Node;", null, l4, l9, 2);
            mv.visitMaxs(2, 3);
            mv.visitEnd();
        }
        cw.visitEnd();
        return cw.toByteArray();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy