/** * Creates Proxetta with all aspects. The following aspects are created: * <ul> * <li>Transaction proxy - applied on all classes that contains public top-level methods * annotated with <code>@Transaction</code> annotation. This is just one way how proxies * can be applied - since base configuration is in Java, everything is possible.</li> * </ul> */ @Override public void start() { initLogger(); log.info("PROXETTA start ----------"); final ProxyAspect[] proxyAspectsArray = this.proxyAspects.toArray(new ProxyAspect[0]); log.debug("Total proxy aspects: " + proxyAspectsArray.length); // proxetta = Proxetta.wrapperProxetta().setCreateTargetInDefaultCtor(true).withAspects(proxyAspectsArray); proxetta = Proxetta.proxyProxetta().withAspects(proxyAspectsArray); log.info("PROXETTA OK!"); }
process(); if ((!proxetta.isForced()) && (!isProxyApplied())) { if (log.isDebugEnabled()) { log.debug("Proxy not applied: " + StringUtil.toSafeString(targetClassName)); ClassLoader classLoader = proxetta.getClassLoader();
/** * Returns new suffix or <code>null</code> if suffix is not in use. */ protected String resolveClassNameSuffix() { String classNameSuffix = proxetta.getClassNameSuffix(); if (classNameSuffix == null) { return null; } if (!proxetta.isVariableClassName()) { return classNameSuffix; } suffixCounter++; return classNameSuffix + suffixCounter; }
/** * Applies proxetta on bean class before bean registration. */ @SuppressWarnings("unchecked") @Override protected <T> BeanDefinition<T> createBeanDefinitionForRegistration( final String name, Class<T> type, final Scope scope, final WiringMode wiringMode, final Consumer<T> consumer) { if (proxetta != null) { final Class originalType = type; final ProxettaFactory builder = proxetta.proxy(); builder.setTarget(type); type = builder.define(); return new ProxettaBeanDefinition( name, type, scope, wiringMode, originalType, proxetta.getAspects(new ProxyAspect[0]), consumer); } return super.createBeanDefinitionForRegistration(name, type, scope, wiringMode, consumer); }
/** * Returns {@link WrapperProxetta} used for building loggable prepared statements. * Initializes proxetta when called for the first time. */ protected BaseLoggableFactory(final Class<T> targetClass) { this.targetClass = targetClass; this.proxetta = Proxetta.wrapperProxetta().withAspect(ProxyAspect.of(LoggableAdvice.class, methodInfo -> { int argumentsCount = methodInfo.getArgumentsCount(); char argumentType = 0; if (argumentsCount >= 1) { argumentType = methodInfo.getArgument(1).getOpcode(); } return methodInfo.getReturnType().getOpcode() == 'V' && // void-returning method argumentType == 'I' && // first argument type methodInfo.isPublicMethod() && methodInfo.getMethodName().startsWith("set") && // set* (argumentsCount == 2 || argumentsCount == 3); // number of arguments })); }
/** * Returns byte array of created class. */ public byte[] create() { process(); byte[] result = toByteArray(); dumpClassInDebugFolder(result); if ((!proxetta.isForced()) && (!isProxyApplied())) { if (log.isDebugEnabled()) { log.debug("Proxy not applied: " + StringUtil.toSafeString(targetClassName)); } return null; } if (log.isDebugEnabled()) { log.debug("Proxy created " + StringUtil.toSafeString(targetClassName)); } return result; }
/** * Writes created class content to output folder for debugging purposes. */ protected void dumpClassInDebugFolder(final byte[] bytes) { File debugFolder = proxetta.getDebugFolder(); if (debugFolder == null) { return; } if (!debugFolder.exists() || !debugFolder.isDirectory()) { log.warn("Invalid debug folder: " + debugFolder); } String fileName = proxyClassName; if (fileName == null) { fileName = "proxetta-" + System.currentTimeMillis(); } fileName += ".class"; File file = new File(debugFolder, fileName); try { FileUtil.writeBytes(file, bytes); } catch (IOException ioex) { log.warn("Error writing class as " + file, ioex); } }
/** * Reads the target and creates destination class. */ protected void process() { if (targetInputStream == null) { throw new ProxettaException("Target missing: " + targetClassName); } // create class reader final ClassReader classReader; try { classReader = new ClassReader(targetInputStream); } catch (IOException ioex) { throw new ProxettaException("Error reading class input stream", ioex); } // reads information final TargetClassInfoReader targetClassInfoReader = new TargetClassInfoReader(proxetta.getClassLoader()); classReader.accept(targetClassInfoReader, 0); this.destClassWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); // create proxy if (log.isDebugEnabled()) { log.debug("processing: " + classReader.getClassName()); } WorkData wd = process(classReader, targetClassInfoReader); // store important data proxyApplied = wd.proxyApplied; proxyClassName = wd.thisReference.replace('/', '.'); }
final Proxetta proxetta = proxettaSupplier.get(); existing = proxetta.proxy().setTarget(actionClass).define();
@Test void testClassesWithGenericsAsReturnValueWrapperDefault() { try { ProxyAspect aspect = new ProxyAspect(DelegateAdvice.class, new AllMethodsPointcut()); WrapperProxetta proxetta = Proxetta.wrapperProxetta().withAspects(aspect); WrapperProxettaFactory builder = proxetta.proxy().setTarget(Foo.class).setTargetInterface(IFoo.class); builder.newInstance(); } catch (Exception ex) { ex.printStackTrace(); fail(ex.toString()); } }
/** * Applies proxetta on bean class before bean registration. */ @SuppressWarnings("unchecked") @Override protected <T> BeanDefinition<T> createBeanDefinitionForRegistration( final String name, Class<T> type, final Scope scope, final WiringMode wiringMode, final Consumer<T> consumer) { if (proxetta != null) { final Class originalType = type; final ProxettaFactory builder = proxetta.proxy(); builder.setTarget(type); type = builder.define(); return new ProxettaBeanDefinition( name, type, scope, wiringMode, originalType, proxetta.getAspects(new ProxyAspect[0]), consumer); } return super.createBeanDefinitionForRegistration(name, type, scope, wiringMode, consumer); }
/** * Returns byte array of created class. */ public byte[] create() { process(); byte[] result = toByteArray(); dumpClass(result); if ((proxetta.isForced() == false) && (isProxyApplied() == false)) { if (log.isDebugEnabled()) { log.debug("proxy not applied " + StringUtil.toSafeString(targetClassName)); } return null; } if (log.isDebugEnabled()) { log.debug("proxy created " + StringUtil.toSafeString(targetClassName)); } return result; }
/** * Writes created class content to output folder for debugging purposes. */ protected void dumpClass(byte[] bytes) { String debugFolder = proxetta.getDebugFolder(); if (debugFolder == null) { return; } File folder = new File(debugFolder); if (!folder.exists()) { folder.mkdirs(); } String fileName = proxyClassName; if (fileName == null) { fileName = "proxetta-" + System.currentTimeMillis(); } fileName += ".class"; File file = new File(folder, fileName); try { FileUtil.writeBytes(file, bytes); } catch (IOException ioex) { log.warn("Error dumping class", ioex); } }
/** * Reads the target and creates destination class. */ protected void process() { if (targetInputStream == null) { throw new ProxettaException("Target missing: " + targetClassName); } // create class reader final ClassReader classReader; try { classReader = new ClassReader(targetInputStream); } catch (IOException ioex) { throw new ProxettaException("Error reading class input stream", ioex); } // reads information final TargetClassInfoReader targetClassInfoReader = new TargetClassInfoReader(proxetta.getClassLoader()); classReader.accept(targetClassInfoReader, 0); this.destClassWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); // create proxy if (log.isDebugEnabled()) { log.debug("processing: " + classReader.getClassName()); } WorkData wd = process(classReader, targetClassInfoReader); // store important data proxyApplied = wd.proxyApplied; proxyClassName = wd.thisReference.replace('/', '.'); }
public MethrefProxetta() { ProxyAspect aspects = new ProxyAspect(MethrefAdvice.class, new AllMethodsPointcut()); proxetta = Proxetta.proxyProxetta().withAspect(aspects); proxetta.setClassNameSuffix(METHREF_CLASSNAME_SUFFIX); }
@Test void testWrapperProxetta_unopen() throws InvocationTargetException, IllegalAccessException { ProxyAspect proxyAspect = ProxyAspect.of(LogProxyAdvice.class, MethodWithAnnotationPointcut.of(Transaction.class)); final Object service = Proxetta.wrapperProxetta() .withAspect(proxyAspect) .setCreateTargetInDefaultCtor(true) .proxy() .setTarget(Test568Service.class) .newInstance(); // no need to inject since setCreateTargetInstanceInDefaultCtor is set // ProxettaUtil.injectTargetIntoWrapper(new Test568Service(), service); Method method = jodd.util.ClassUtil.findMethod(service.getClass(), "findMember"); String result = (String) method.invoke(service, Long.valueOf(1)); assertEquals("1", result); }
/** * Returns new suffix or <code>null</code> if suffix is not in use. */ protected String resolveClassNameSuffix() { String classNameSuffix = proxetta.getClassNameSuffix(); if (classNameSuffix == null) { return null; } if (proxetta.isVariableClassName() == false) { return classNameSuffix; } suffixCounter++; return classNameSuffix + suffixCounter; }
process(); if ((!proxetta.isForced()) && (!isProxyApplied())) { if (log.isDebugEnabled()) { log.debug("Proxy not applied: " + StringUtil.toSafeString(targetClassName)); ClassLoader classLoader = proxetta.getClassLoader();
/** * Returns byte array of created class. */ public byte[] create() { process(); byte[] result = toByteArray(); dumpClassInDebugFolder(result); if ((!proxetta.isForced()) && (!isProxyApplied())) { if (log.isDebugEnabled()) { log.debug("Proxy not applied: " + StringUtil.toSafeString(targetClassName)); } return null; } if (log.isDebugEnabled()) { log.debug("Proxy created " + StringUtil.toSafeString(targetClassName)); } return result; }
/** * Writes created class content to output folder for debugging purposes. */ protected void dumpClassInDebugFolder(final byte[] bytes) { File debugFolder = proxetta.getDebugFolder(); if (debugFolder == null) { return; } if (!debugFolder.exists() || !debugFolder.isDirectory()) { log.warn("Invalid debug folder: " + debugFolder); } String fileName = proxyClassName; if (fileName == null) { fileName = "proxetta-" + System.currentTimeMillis(); } fileName += ".class"; File file = new File(debugFolder, fileName); try { FileUtil.writeBytes(file, bytes); } catch (IOException ioex) { log.warn("Error writing class as " + file, ioex); } }