use of org.apache.xbean.asm6.Opcodes.ACC_SUPER 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();
}
use of org.apache.xbean.asm6.Opcodes.ACC_SUPER 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;
}
use of org.apache.xbean.asm6.Opcodes.ACC_SUPER in project component-runtime by Talend.
the class PluginGenerator method createService.
private byte[] createService(final JarOutputStream outputStream, final String packageName, final String name) throws IOException {
final String className = packageName + "/AService.class";
outputStream.putNextEntry(new ZipEntry(className));
final ClassWriter writer = new ClassWriter(COMPUTE_FRAMES);
writer.visitAnnotation(Type.getDescriptor(Service.class), true).visitEnd();
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);
final MethodVisitor action = writer.visitMethod(ACC_PUBLIC, "doAction", "(L" + packageName + "/AModel;)L" + packageName + "/AModel;", null, new String[0]);
final AnnotationVisitor actionAnnotation = action.visitAnnotation(Type.getDescriptor(Action.class), true);
actionAnnotation.visit("family", "proc");
actionAnnotation.visit("value", name + "Action");
actionAnnotation.visitEnd();
action.visitCode();
action.visitTypeInsn(NEW, packageName + "/AModel");
action.visitInsn(DUP);
action.visitMethodInsn(INVOKESPECIAL, packageName + "/AModel", "<init>", "()V", false);
action.visitInsn(ARETURN);
action.visitInsn(ARETURN);
action.visitMaxs(1, 1);
action.visitEnd();
writer.visitEnd();
return writer.toByteArray();
}
use of org.apache.xbean.asm6.Opcodes.ACC_SUPER in project component-runtime by Talend.
the class PluginGenerator method createProcessor.
private byte[] createProcessor(final JarOutputStream outputStream, final String packageName) throws IOException {
final String className = packageName + "/AProcessor.class";
outputStream.putNextEntry(new ZipEntry(className));
final ClassWriter writer = new ClassWriter(COMPUTE_FRAMES);
final AnnotationVisitor processorAnnotation = writer.visitAnnotation(Type.getDescriptor(Processor.class), true);
processorAnnotation.visit("family", "comp");
processorAnnotation.visit("name", "proc");
processorAnnotation.visitEnd();
writer.visit(V1_8, ACC_PUBLIC + ACC_SUPER, className.substring(0, className.length() - ".class".length()), null, Type.getInternalName(Object.class), new String[] { Serializable.class.getName().replace(".", "/") });
writer.visitSource(className.replace(".class", ".java"), null);
addConstructor(writer);
// generate a processor
final MethodVisitor emitMethod = writer.visitMethod(ACC_PUBLIC, "emit", "(L" + packageName + "/AModel;)L" + packageName + "/AModel;", null, new String[0]);
emitMethod.visitAnnotation(Type.getDescriptor(ElementListener.class), true).visitEnd();
emitMethod.visitCode();
emitMethod.visitTypeInsn(NEW, packageName + "/AModel");
emitMethod.visitInsn(DUP);
emitMethod.visitMethodInsn(INVOKESPECIAL, packageName + "/AModel", "<init>", "()V", false);
emitMethod.visitInsn(ARETURN);
emitMethod.visitInsn(ARETURN);
emitMethod.visitMaxs(1, 1);
emitMethod.visitEnd();
writer.visitEnd();
return writer.toByteArray();
}
Aggregations