Search in sources :

Example 1 with NEW

use of org.apache.xbean.asm6.Opcodes.NEW in project component-runtime by Talend.

the class PluginGenerator method createChainPlugin.

public File createChainPlugin(final File dir, final String plugin) {
    final File target = new File(dir, plugin);
    try (final JarOutputStream outputStream = new JarOutputStream(new FileOutputStream(target))) {
        final String packageName = toPackage(target.getParentFile().getParentFile().getName()).replace(".", "/");
        final String sourcePackage = "org/talend/test";
        final String fromPack = sourcePackage.replace('/', '.');
        final String toPack = packageName.replace('.', '/');
        final File root = new File(jarLocation(getClass()), sourcePackage);
        ofNullable(root.listFiles()).map(Stream::of).orElseGet(Stream::empty).filter(c -> c.getName().endsWith(".class")).forEach(clazz -> {
            try (final InputStream is = new FileInputStream(clazz)) {
                final ClassReader reader = new ClassReader(is);
                final ClassWriter writer = new ClassWriter(COMPUTE_FRAMES);
                reader.accept(new ClassRemapper(writer, new Remapper() {

                    @Override
                    public String map(final String key) {
                        return key.replace(sourcePackage, toPack).replace(fromPack, packageName);
                    }
                }), EXPAND_FRAMES);
                outputStream.putNextEntry(new JarEntry(toPack + '/' + clazz.getName()));
                outputStream.write(writer.toByteArray());
            } catch (final IOException e) {
                fail(e.getMessage());
            }
        });
    } catch (final IOException e) {
        throw new IllegalStateException(e);
    }
    return target;
}
Also used : Assertions.fail(org.junit.jupiter.api.Assertions.fail) COMPUTE_FRAMES(org.apache.xbean.asm6.ClassWriter.COMPUTE_FRAMES) Optional.ofNullable(java.util.Optional.ofNullable) FileOutputStream(java.io.FileOutputStream) IOException(java.io.IOException) FileInputStream(java.io.FileInputStream) ClassReader(org.apache.xbean.asm6.ClassReader) File(java.io.File) JarEntry(java.util.jar.JarEntry) Stream(java.util.stream.Stream) ClassRemapper(org.apache.xbean.asm6.commons.ClassRemapper) JarLocation.jarLocation(org.apache.ziplock.JarLocation.jarLocation) ClassWriter(org.apache.xbean.asm6.ClassWriter) EXPAND_FRAMES(org.apache.xbean.asm6.ClassReader.EXPAND_FRAMES) JarOutputStream(java.util.jar.JarOutputStream) Remapper(org.apache.xbean.asm6.commons.Remapper) InputStream(java.io.InputStream) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) JarOutputStream(java.util.jar.JarOutputStream) IOException(java.io.IOException) JarEntry(java.util.jar.JarEntry) ClassRemapper(org.apache.xbean.asm6.commons.ClassRemapper) FileInputStream(java.io.FileInputStream) ClassWriter(org.apache.xbean.asm6.ClassWriter) ClassRemapper(org.apache.xbean.asm6.commons.ClassRemapper) Remapper(org.apache.xbean.asm6.commons.Remapper) FileOutputStream(java.io.FileOutputStream) ClassReader(org.apache.xbean.asm6.ClassReader) FileOutputStream(java.io.FileOutputStream) FileInputStream(java.io.FileInputStream) Stream(java.util.stream.Stream) JarOutputStream(java.util.jar.JarOutputStream) InputStream(java.io.InputStream) File(java.io.File)

Example 2 with NEW

use of org.apache.xbean.asm6.Opcodes.NEW in project component-runtime by Talend.

the class PluginGenerator method createChainPlugin.

public File createChainPlugin(final File dir, final String plugin) {
    final File target = new File(dir, plugin);
    try (final JarOutputStream outputStream = new JarOutputStream(new FileOutputStream(target))) {
        final String packageName = toPackage(target.getParentFile().getParentFile().getName()).replace(".", "/");
        final String sourcePackage = "org/talend/test";
        final String fromPack = sourcePackage.replace('/', '.');
        final String toPack = packageName.replace('.', '/');
        final File root = new File(jarLocation(getClass()), sourcePackage);
        ofNullable(root.listFiles()).map(Stream::of).orElseGet(Stream::empty).filter(c -> c.getName().endsWith(".class")).forEach(clazz -> {
            try (final InputStream is = new FileInputStream(clazz)) {
                final ClassReader reader = new ClassReader(is);
                final ClassWriter writer = new ClassWriter(COMPUTE_FRAMES);
                reader.accept(new ClassRemapper(writer, new Remapper() {

                    @Override
                    public String map(final String key) {
                        return key.replace(sourcePackage, toPack).replace(fromPack, packageName);
                    }
                }), EXPAND_FRAMES);
                outputStream.putNextEntry(new JarEntry(toPack + '/' + clazz.getName()));
                outputStream.write(writer.toByteArray());
            } catch (final IOException e) {
                fail(e.getMessage());
            }
        });
    } catch (final IOException e) {
        throw new IllegalStateException(e);
    }
    return target;
}
Also used : Assertions.fail(org.junit.jupiter.api.Assertions.fail) Action(org.talend.sdk.component.api.service.Action) ClassReader(org.apache.xbean.asm6.ClassReader) V1_8(org.apache.xbean.asm6.Opcodes.V1_8) Type(org.apache.xbean.asm6.Type) JarEntry(java.util.jar.JarEntry) Processor(org.talend.sdk.component.api.processor.Processor) ACC_PUBLIC(org.apache.xbean.asm6.Opcodes.ACC_PUBLIC) ClassRemapper(org.apache.xbean.asm6.commons.ClassRemapper) ElementListener(org.talend.sdk.component.api.processor.ElementListener) ALOAD(org.apache.xbean.asm6.Opcodes.ALOAD) EXPAND_FRAMES(org.apache.xbean.asm6.ClassReader.EXPAND_FRAMES) ACC_SUPER(org.apache.xbean.asm6.Opcodes.ACC_SUPER) JarOutputStream(java.util.jar.JarOutputStream) ZipEntry(java.util.zip.ZipEntry) Remapper(org.apache.xbean.asm6.commons.Remapper) COMPUTE_FRAMES(org.apache.xbean.asm6.ClassWriter.COMPUTE_FRAMES) INVOKESPECIAL(org.apache.xbean.asm6.Opcodes.INVOKESPECIAL) AnnotationVisitor(org.apache.xbean.asm6.AnnotationVisitor) Optional.ofNullable(java.util.Optional.ofNullable) NEW(org.apache.xbean.asm6.Opcodes.NEW) FileOutputStream(java.io.FileOutputStream) IOException(java.io.IOException) FileInputStream(java.io.FileInputStream) RETURN(org.apache.xbean.asm6.Opcodes.RETURN) MethodVisitor(org.apache.xbean.asm6.MethodVisitor) Collectors.joining(java.util.stream.Collectors.joining) File(java.io.File) StandardCharsets(java.nio.charset.StandardCharsets) Serializable(java.io.Serializable) Stream(java.util.stream.Stream) DUP(org.apache.xbean.asm6.Opcodes.DUP) JarLocation.jarLocation(org.apache.ziplock.JarLocation.jarLocation) ClassWriter(org.apache.xbean.asm6.ClassWriter) Service(org.talend.sdk.component.api.service.Service) ARETURN(org.apache.xbean.asm6.Opcodes.ARETURN) InputStream(java.io.InputStream) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) JarOutputStream(java.util.jar.JarOutputStream) IOException(java.io.IOException) JarEntry(java.util.jar.JarEntry) ClassRemapper(org.apache.xbean.asm6.commons.ClassRemapper) FileInputStream(java.io.FileInputStream) ClassWriter(org.apache.xbean.asm6.ClassWriter) ClassRemapper(org.apache.xbean.asm6.commons.ClassRemapper) Remapper(org.apache.xbean.asm6.commons.Remapper) FileOutputStream(java.io.FileOutputStream) ClassReader(org.apache.xbean.asm6.ClassReader) JarOutputStream(java.util.jar.JarOutputStream) FileOutputStream(java.io.FileOutputStream) FileInputStream(java.io.FileInputStream) Stream(java.util.stream.Stream) InputStream(java.io.InputStream) File(java.io.File)

Example 3 with NEW

use of org.apache.xbean.asm6.Opcodes.NEW in project component-runtime by Talend.

the class PluginGenerator method createModel.

private byte[] createModel(final JarOutputStream outputStream, String packageName) throws IOException {
    final String className = packageName + "/AModel.class";
    outputStream.putNextEntry(new ZipEntry(className));
    final ClassWriter writer = new ClassWriter(COMPUTE_FRAMES);
    writer.visit(V1_8, ACC_PUBLIC + ACC_SUPER, className.substring(0, className.length() - ".class".length()), null, Type.getInternalName(Object.class), null);
    writer.visitSource(className.replace(".class", ".java"), null);
    addConstructor(writer);
    // no real content (fields/methods) for now
    writer.visitEnd();
    return writer.toByteArray();
}
Also used : ZipEntry(java.util.zip.ZipEntry) ClassWriter(org.apache.xbean.asm6.ClassWriter)

Example 4 with NEW

use of org.apache.xbean.asm6.Opcodes.NEW in project component-runtime by Talend.

the class ProxyGenerator method createConstructor.

private String createConstructor(final ClassWriter cw, final Class<?> classToProxy, final String classFileName, final String proxyClassFileName, final Constructor<?> constructor, final boolean withInterceptors) {
    try {
        Constructor superDefaultCt;
        String parentClassFileName;
        String[] exceptions = null;
        if (classToProxy.isInterface()) {
            parentClassFileName = Type.getInternalName(Object.class);
            superDefaultCt = Object.class.getConstructor();
        } else {
            parentClassFileName = classFileName;
            if (constructor == null) {
                superDefaultCt = classToProxy.getConstructor();
            } else {
                superDefaultCt = constructor;
                Class<?>[] exceptionTypes = constructor.getExceptionTypes();
                exceptions = exceptionTypes.length == 0 ? null : new String[exceptionTypes.length];
                for (int i = 0; i < exceptionTypes.length; i++) {
                    exceptions[i] = Type.getInternalName(exceptionTypes[i]);
                }
            }
        }
        final String descriptor = Type.getConstructorDescriptor(superDefaultCt);
        final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", descriptor, null, exceptions);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        if (constructor != null) {
            for (int i = 1; i <= constructor.getParameterTypes().length; i++) {
                mv.visitVarInsn(ALOAD, i);
            }
        }
        mv.visitMethodInsn(INVOKESPECIAL, parentClassFileName, "<init>", descriptor, false);
        if (withInterceptors) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(ACONST_NULL);
            mv.visitFieldInsn(PUTFIELD, proxyClassFileName, FIELD_INTERCEPTOR_HANDLER, Type.getDescriptor(InterceptorHandler.class));
        }
        mv.visitInsn(RETURN);
        mv.visitMaxs(-1, -1);
        mv.visitEnd();
        return parentClassFileName;
    } catch (final NoSuchMethodException e) {
        throw new IllegalStateException(e);
    }
}
Also used : InterceptorHandler(org.talend.sdk.component.api.service.interceptor.InterceptorHandler) Constructor(java.lang.reflect.Constructor) AllArgsConstructor(lombok.AllArgsConstructor) MethodVisitor(org.apache.xbean.asm6.MethodVisitor)

Example 5 with NEW

use of org.apache.xbean.asm6.Opcodes.NEW in project component-runtime by Talend.

the class ProxyGenerator method generateProxy.

public Class<?> generateProxy(final ClassLoader loader, final Class<?> classToProxy, final String plugin, final String key) {
    final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
    final String proxyClassName = fixPreservedPackages((classToProxy.getSigners() != null ? getSignedClassProxyName(classToProxy) : classToProxy.getName()) + "$$TalendServiceProxy");
    final String classFileName = proxyClassName.replace('.', '/');
    final String[] interfaceNames = { Type.getInternalName(Serializable.class) };
    final String superClassName = Type.getInternalName(classToProxy);
    cw.visit(findJavaVersion(classToProxy), ACC_PUBLIC + ACC_SUPER + ACC_SYNTHETIC, classFileName, null, superClassName, interfaceNames);
    cw.visitSource(classFileName + ".java", null);
    if (!Serializable.class.isAssignableFrom(classToProxy)) {
        try {
            classToProxy.getMethod("writeReplace");
        } catch (final NoSuchMethodException e) {
            createSerialisation(cw, plugin, key);
        }
    }
    final boolean hasInterceptors = hasInterceptors(classToProxy);
    if (hasInterceptors) {
        cw.visitField(ACC_PRIVATE, FIELD_INTERCEPTOR_HANDLER, Type.getDescriptor(InterceptorHandler.class), null, null).visitEnd();
        cw.visitField(ACC_PRIVATE | ACC_STATIC, FIELD_INTERCEPTED_METHODS, Type.getDescriptor(Method[].class), null, null).visitEnd();
    }
    createConstructor(cw, classToProxy, superClassName, classFileName, Stream.of(classToProxy.getDeclaredConstructors()).filter(c -> {
        final int modifiers = c.getModifiers();
        return Modifier.isPublic(modifiers) || Modifier.isProtected(modifiers);
    }).sorted((o1, o2) -> {
        // prefer public constructor and then the smallest parameter count
        final int mod1 = o1.getModifiers();
        final int mod2 = o2.getModifiers();
        if (Modifier.isProtected(mod1) && !Modifier.isPublic(mod2)) {
            return 1;
        }
        if (Modifier.isProtected(mod2) && !Modifier.isPublic(mod1)) {
            return -1;
        }
        return o1.getParameterCount() - o2.getParameterCount();
    }).findFirst().orElseThrow(() -> new IllegalArgumentException(classToProxy + " has no default constructor, put at least a protected one")), hasInterceptors);
    final Method[] interceptedMethods;
    if (hasInterceptors) {
        final Collection<Annotation> globalInterceptors = Stream.of(classToProxy.getAnnotations()).filter(this::isInterceptor).collect(toList());
        final AtomicInteger methodIndex = new AtomicInteger();
        interceptedMethods = Stream.of(classToProxy.getMethods()).filter(m -> !"<init>".equals(m.getName()) && (!globalInterceptors.isEmpty() || Stream.of(m.getAnnotations()).anyMatch(this::isInterceptor))).peek(method -> delegateMethod(cw, method, classFileName, methodIndex.getAndIncrement())).toArray(Method[]::new);
    } else {
        interceptedMethods = null;
    }
    final Class<Object> objectClass = Unsafes.defineAndLoadClass(loader, proxyClassName, cw.toByteArray());
    if (hasInterceptors) {
        try {
            final Field interceptedMethodsField = objectClass.getDeclaredField(FIELD_INTERCEPTED_METHODS);
            interceptedMethodsField.setAccessible(true);
            interceptedMethodsField.set(null, interceptedMethods);
        } catch (final Exception e) {
            throw new IllegalStateException(e);
        }
    }
    return objectClass;
}
Also used : ILOAD(org.apache.xbean.asm6.Opcodes.ILOAD) IRETURN(org.apache.xbean.asm6.Opcodes.IRETURN) Intercepts(org.talend.sdk.component.api.service.interceptor.Intercepts) ClassReader(org.apache.xbean.asm6.ClassReader) LRETURN(org.apache.xbean.asm6.Opcodes.LRETURN) V1_8(org.apache.xbean.asm6.Opcodes.V1_8) Type(org.apache.xbean.asm6.Type) ACC_PUBLIC(org.apache.xbean.asm6.Opcodes.ACC_PUBLIC) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ACC_PRIVATE(org.apache.xbean.asm6.Opcodes.ACC_PRIVATE) ALOAD(org.apache.xbean.asm6.Opcodes.ALOAD) ACC_SUPER(org.apache.xbean.asm6.Opcodes.ACC_SUPER) Method(java.lang.reflect.Method) IFEQ(org.apache.xbean.asm6.Opcodes.IFEQ) PUTFIELD(org.apache.xbean.asm6.Opcodes.PUTFIELD) GETFIELD(org.apache.xbean.asm6.Opcodes.GETFIELD) BIPUSH(org.apache.xbean.asm6.Opcodes.BIPUSH) ACC_SYNTHETIC(org.apache.xbean.asm6.Opcodes.ACC_SYNTHETIC) Collection(java.util.Collection) NEW(org.apache.xbean.asm6.Opcodes.NEW) LLOAD(org.apache.xbean.asm6.Opcodes.LLOAD) Serializable(java.io.Serializable) AASTORE(org.apache.xbean.asm6.Opcodes.AASTORE) ACC_VARARGS(org.apache.xbean.asm6.Opcodes.ACC_VARARGS) Stream(java.util.stream.Stream) EmptyVisitor(org.apache.xbean.asm6.shade.commons.EmptyVisitor) INVOKEVIRTUAL(org.apache.xbean.asm6.Opcodes.INVOKEVIRTUAL) Modifier(java.lang.reflect.Modifier) SIPUSH(org.apache.xbean.asm6.Opcodes.SIPUSH) Annotation(java.lang.annotation.Annotation) FRETURN(org.apache.xbean.asm6.Opcodes.FRETURN) CHECKCAST(org.apache.xbean.asm6.Opcodes.CHECKCAST) ASTORE(org.apache.xbean.asm6.Opcodes.ASTORE) InterceptorHandler(org.talend.sdk.component.api.service.interceptor.InterceptorHandler) DLOAD(org.apache.xbean.asm6.Opcodes.DLOAD) INVOKESTATIC(org.apache.xbean.asm6.Opcodes.INVOKESTATIC) Label(org.apache.xbean.asm6.Label) ATHROW(org.apache.xbean.asm6.Opcodes.ATHROW) Constructor(java.lang.reflect.Constructor) ANEWARRAY(org.apache.xbean.asm6.Opcodes.ANEWARRAY) AALOAD(org.apache.xbean.asm6.Opcodes.AALOAD) ACC_PROTECTED(org.apache.xbean.asm6.Opcodes.ACC_PROTECTED) POP(org.apache.xbean.asm6.Opcodes.POP) ICONST_0(org.apache.xbean.asm6.Opcodes.ICONST_0) ICONST_2(org.apache.xbean.asm6.Opcodes.ICONST_2) SKIP_DEBUG(org.apache.xbean.asm6.ClassReader.SKIP_DEBUG) ICONST_1(org.apache.xbean.asm6.Opcodes.ICONST_1) INVOKEINTERFACE(org.apache.xbean.asm6.Opcodes.INVOKEINTERFACE) INVOKESPECIAL(org.apache.xbean.asm6.Opcodes.INVOKESPECIAL) ICONST_4(org.apache.xbean.asm6.Opcodes.ICONST_4) ICONST_3(org.apache.xbean.asm6.Opcodes.ICONST_3) FLOAD(org.apache.xbean.asm6.Opcodes.FLOAD) ACONST_NULL(org.apache.xbean.asm6.Opcodes.ACONST_NULL) RETURN(org.apache.xbean.asm6.Opcodes.RETURN) Field(java.lang.reflect.Field) MethodVisitor(org.apache.xbean.asm6.MethodVisitor) ACC_STATIC(org.apache.xbean.asm6.Opcodes.ACC_STATIC) ObjectStreamException(java.io.ObjectStreamException) Collectors.toList(java.util.stream.Collectors.toList) DRETURN(org.apache.xbean.asm6.Opcodes.DRETURN) GETSTATIC(org.apache.xbean.asm6.Opcodes.GETSTATIC) DUP(org.apache.xbean.asm6.Opcodes.DUP) ClassWriter(org.apache.xbean.asm6.ClassWriter) ICONST_5(org.apache.xbean.asm6.Opcodes.ICONST_5) ARETURN(org.apache.xbean.asm6.Opcodes.ARETURN) AllArgsConstructor(lombok.AllArgsConstructor) InputStream(java.io.InputStream) Serializable(java.io.Serializable) Method(java.lang.reflect.Method) ClassWriter(org.apache.xbean.asm6.ClassWriter) Annotation(java.lang.annotation.Annotation) ObjectStreamException(java.io.ObjectStreamException) Field(java.lang.reflect.Field) AtomicInteger(java.util.concurrent.atomic.AtomicInteger)

Aggregations

ClassWriter (org.apache.xbean.asm6.ClassWriter)8 ClassReader (org.apache.xbean.asm6.ClassReader)7 MethodVisitor (org.apache.xbean.asm6.MethodVisitor)7 InputStream (java.io.InputStream)6 Stream (java.util.stream.Stream)5 File (java.io.File)4 FileInputStream (java.io.FileInputStream)4 FileOutputStream (java.io.FileOutputStream)4 IOException (java.io.IOException)4 Optional.ofNullable (java.util.Optional.ofNullable)4 JarEntry (java.util.jar.JarEntry)4 JarOutputStream (java.util.jar.JarOutputStream)4 ZipEntry (java.util.zip.ZipEntry)4 EXPAND_FRAMES (org.apache.xbean.asm6.ClassReader.EXPAND_FRAMES)4 COMPUTE_FRAMES (org.apache.xbean.asm6.ClassWriter.COMPUTE_FRAMES)4 ClassRemapper (org.apache.xbean.asm6.commons.ClassRemapper)4 Remapper (org.apache.xbean.asm6.commons.Remapper)4 JarLocation.jarLocation (org.apache.ziplock.JarLocation.jarLocation)4 Assertions.fail (org.junit.jupiter.api.Assertions.fail)4 Collectors.toList (java.util.stream.Collectors.toList)3