Search in sources :

Example 1 with ClassWriter

use of com.sun.xml.ws.org.objectweb.asm.ClassWriter in project metro-jax-ws by eclipse-ee4j.

the class WrapperBeanGenerator method createBeanImage.

// Creates class's bytes
private static byte[] createBeanImage(String className, String rootName, String rootNS, String typeName, String typeNS, Collection<Field> fields) throws Exception {
    ClassWriter cw = new ClassWriter(0);
    // org.objectweb.asm.util.TraceClassVisitor cw = new org.objectweb.asm.util.TraceClassVisitor(actual, new java.io.PrintWriter(System.out));
    cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, replaceDotWithSlash(className), null, "java/lang/Object", null);
    AnnotationVisitor root = cw.visitAnnotation("Ljakarta/xml/bind/annotation/XmlRootElement;", true);
    root.visit("name", rootName);
    root.visit("namespace", rootNS);
    root.visitEnd();
    AnnotationVisitor type = cw.visitAnnotation("Ljakarta/xml/bind/annotation/XmlType;", true);
    type.visit("name", typeName);
    type.visit("namespace", typeNS);
    if (fields.size() > 1) {
        AnnotationVisitor propVisitor = type.visitArray("propOrder");
        for (Field field : fields) {
            propVisitor.visit("propOrder", field.fieldName);
        }
        propVisitor.visitEnd();
    }
    type.visitEnd();
    for (Field field : fields) {
        FieldVisitor fv = cw.visitField(Opcodes.ACC_PUBLIC, field.fieldName, field.asmType.getDescriptor(), field.getSignature(), null);
        for (Annotation ann : field.jaxbAnnotations) {
            if (ann instanceof XmlMimeType) {
                AnnotationVisitor mime = fv.visitAnnotation("Ljakarta/xml/bind/annotation/XmlMimeType;", true);
                mime.visit("value", ((XmlMimeType) ann).value());
                mime.visitEnd();
            } else if (ann instanceof XmlJavaTypeAdapter) {
                AnnotationVisitor ada = fv.visitAnnotation("Ljakarta/xml/bind/annotation/adapters/XmlJavaTypeAdapter;", true);
                ada.visit("value", getASMType(((XmlJavaTypeAdapter) ann).value()));
                // XmlJavaTypeAdapter.type() is for package only. No need to copy.
                // ada.visit("type", ((XmlJavaTypeAdapter)ann).type());
                ada.visitEnd();
            } else if (ann instanceof XmlAttachmentRef) {
                AnnotationVisitor att = fv.visitAnnotation("Ljakarta/xml/bind/annotation/XmlAttachmentRef;", true);
                att.visitEnd();
            } else if (ann instanceof XmlList) {
                AnnotationVisitor list = fv.visitAnnotation("Ljakarta/xml/bind/annotation/XmlList;", true);
                list.visitEnd();
            } else if (ann instanceof XmlElement) {
                AnnotationVisitor elem = fv.visitAnnotation("Ljakarta/xml/bind/annotation/XmlElement;", true);
                XmlElement xmlElem = (XmlElement) ann;
                elem.visit("name", xmlElem.name());
                elem.visit("namespace", xmlElem.namespace());
                if (xmlElem.nillable()) {
                    elem.visit("nillable", true);
                }
                if (xmlElem.required()) {
                    elem.visit("required", true);
                }
                elem.visitEnd();
            } else {
                throw new WebServiceException("Unknown JAXB annotation " + ann);
            }
        }
        fv.visitEnd();
    }
    MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
    mv.visitCode();
    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
    mv.visitInsn(Opcodes.RETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();
    cw.visitEnd();
    if (LOGGER.isLoggable(Level.FINE)) {
        // Class's @XmlRootElement
        StringBuilder sb = new StringBuilder();
        sb.append("\n");
        sb.append("@XmlRootElement(name=").append(rootName).append(", namespace=").append(rootNS).append(")");
        // Class's @XmlType
        sb.append("\n");
        sb.append("@XmlType(name=").append(typeName).append(", namespace=").append(typeNS);
        if (fields.size() > 1) {
            sb.append(", propOrder={");
            for (Field field : fields) {
                sb.append(" ");
                sb.append(field.fieldName);
            }
            sb.append(" }");
        }
        sb.append(")");
        // class declaration
        sb.append("\n");
        sb.append("public class ").append(className).append(" {");
        // fields declaration
        for (Field field : fields) {
            sb.append("\n");
            // Field's other JAXB annotations
            for (Annotation ann : field.jaxbAnnotations) {
                sb.append("\n    ");
                if (ann instanceof XmlMimeType) {
                    sb.append("@XmlMimeType(value=").append(((XmlMimeType) ann).value()).append(")");
                } else if (ann instanceof XmlJavaTypeAdapter) {
                    sb.append("@XmlJavaTypeAdapter(value=").append(getASMType(((XmlJavaTypeAdapter) ann).value())).append(")");
                } else if (ann instanceof XmlAttachmentRef) {
                    sb.append("@XmlAttachmentRef");
                } else if (ann instanceof XmlList) {
                    sb.append("@XmlList");
                } else if (ann instanceof XmlElement) {
                    XmlElement xmlElem = (XmlElement) ann;
                    sb.append("\n    ");
                    sb.append("@XmlElement(name=").append(xmlElem.name()).append(", namespace=").append(xmlElem.namespace());
                    if (xmlElem.nillable()) {
                        sb.append(", nillable=true");
                    }
                    if (xmlElem.required()) {
                        sb.append(", required=true");
                    }
                    sb.append(")");
                } else {
                    throw new WebServiceException("Unknown JAXB annotation " + ann);
                }
            }
            // Field declaration
            sb.append("\n    ");
            sb.append("public ");
            if (field.getSignature() == null) {
                sb.append(field.asmType.getDescriptor());
            } else {
                sb.append(field.getSignature());
            }
            sb.append(" ");
            sb.append(field.fieldName);
        }
        sb.append("\n\n}");
        LOGGER.fine(sb.toString());
    }
    return cw.toByteArray();
}
Also used : XmlMimeType(jakarta.xml.bind.annotation.XmlMimeType) WebServiceException(jakarta.xml.ws.WebServiceException) XmlJavaTypeAdapter(jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter) FieldVisitor(com.sun.xml.ws.org.objectweb.asm.FieldVisitor) ClassWriter(com.sun.xml.ws.org.objectweb.asm.ClassWriter) Annotation(java.lang.annotation.Annotation) XmlList(jakarta.xml.bind.annotation.XmlList) MethodVisitor(com.sun.xml.ws.org.objectweb.asm.MethodVisitor) XmlAttachmentRef(jakarta.xml.bind.annotation.XmlAttachmentRef) AnnotationVisitor(com.sun.xml.ws.org.objectweb.asm.AnnotationVisitor) XmlElement(jakarta.xml.bind.annotation.XmlElement)

Aggregations

AnnotationVisitor (com.sun.xml.ws.org.objectweb.asm.AnnotationVisitor)1 ClassWriter (com.sun.xml.ws.org.objectweb.asm.ClassWriter)1 FieldVisitor (com.sun.xml.ws.org.objectweb.asm.FieldVisitor)1 MethodVisitor (com.sun.xml.ws.org.objectweb.asm.MethodVisitor)1 XmlAttachmentRef (jakarta.xml.bind.annotation.XmlAttachmentRef)1 XmlElement (jakarta.xml.bind.annotation.XmlElement)1 XmlList (jakarta.xml.bind.annotation.XmlList)1 XmlMimeType (jakarta.xml.bind.annotation.XmlMimeType)1 XmlJavaTypeAdapter (jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter)1 WebServiceException (jakarta.xml.ws.WebServiceException)1 Annotation (java.lang.annotation.Annotation)1