/** * Creates a new instance of {@link WrapperProxetta}. */ public static WrapperProxetta wrapperProxetta() { return new WrapperProxetta(); }
/** * {@inheritDoc} */ @Override protected WorkData process(final ClassReader cr, final TargetClassInfoReader targetClassInfoReader) { final ProxettaWrapperClassBuilder pcb = new ProxettaWrapperClassBuilder( targetClassOrInterface, targetInterface, targetFieldName, destClassWriter, proxetta.getAspects(new ProxyAspect[0]), resolveClassNameSuffix(), requestedProxyClassName, targetClassInfoReader, createTargetInDefaultCtor ); cr.accept(pcb, 0); return pcb.getWorkData(); }
@Test void testMethodAnnotationsWrapper() throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { WrapperProxetta proxetta = Proxetta .wrapperProxetta() .withAspect( new ProxyAspect(HeroProxyAdvice.class, ((ProxyPointcut) MethodInfo::isTopLevelMethod).and(AllRealMethodsPointcut.get()) )) //.setDebugFolder("/Users/igor/") ; WrapperProxettaFactory proxettaBuilder = proxetta.proxy(); proxettaBuilder.setTarget(Hero.class); proxetta.setVariableClassName(true); Object hero = proxettaBuilder.newInstance(); Method nameMethod = hero.getClass().getMethod("name"); assertEquals("BatmanHero37W88.3CatWoman99speeeeedXRAYnull", nameMethod.invoke(hero)); }
@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); }
@Test void testClassAnnotationsWrapper() throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { WrapperProxetta proxetta = Proxetta .wrapperProxetta() .withAspects( new ProxyAspect(HeroProxyAdvice2.class, ((ProxyPointcut) MethodInfo::isTopLevelMethod).and(AllRealMethodsPointcut.get()) )) //.setDebugFolder("/Users/igor/") ; WrapperProxettaFactory proxettaBuilder = proxetta.proxy(); proxettaBuilder.setTarget(Hero.class); proxetta.setVariableClassName(true); Object hero = proxettaBuilder.newInstance(); Method nameMethod = hero.getClass().getMethod("name"); assertEquals("SilverHero89W99.222None1000speeeeedXRAYnull", nameMethod.invoke(hero)); }
@Test void testClassWrapperCastToInterface() throws Exception { Calc calc = new CalcImpl(); WrapperProxetta proxetta = Proxetta.wrapperProxetta().withAspect(new ProxyAspect(StatCounterAdvice.class, methodInfo -> !methodInfo.isRootMethod() && methodInfo.isPublicMethod())); //proxetta.setDebugFolder("/Users/igor"); // wrapper over CLASS casted to interface, // resulting object has ONE interface // ALL target methods are wrapped WrapperProxettaFactory builder = proxetta.proxy().setTarget(calc.getClass()).setTargetInterface(Calc.class).setTargetProxyClassName(".CalcImpl2"); Class<Calc> calc2Class = builder.define(); Calc calc2 = calc2Class.newInstance(); builder.injectTargetIntoWrapper(calc, calc2); assertEquals(1, StatCounter.counter); // counter in static block !!! calc2.hello(); assertEquals(2, StatCounter.counter); assertEquals(10, calc2.calculate(3, 7)); assertEquals(3, StatCounter.counter); assertNotNull(calc2Class.getMethod("customMethod")); }
@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()); } }
/** * 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 })); }
protected T wrap(final T preparedStatement, final String sql) { if (wrappedStatement == null) { builder = proxetta.proxy();
/** * Defines if target should be created in ctor, so no additional injection is required. */ public WrapperProxetta setCreateTargetInDefaultCtor(final boolean createTargetInstanceInDefaultCtor) { this.createTargetInDefaultCtor = createTargetInstanceInDefaultCtor; return _this(); }
public WrapperProxettaBuilder builder(Class targetClassOrInterface) { WrapperProxettaBuilder builder = builder(); builder.setTarget(targetClassOrInterface); return builder; }
/** * Returns {@link WrapperProxetta} used for building loggable prepared statements. * Initializes proxetta when called for the first time. */ public static WrapperProxetta getProxetta() { if (proxetta == null) { proxetta = WrapperProxetta.withAspects(new ProxyAspect(LoggableAdvice.class, new ProxyPointcutSupport() { public boolean apply(MethodInfo methodInfo) { int argumentsCount = methodInfo.getArgumentsCount(); char argumentType = 0; if (argumentsCount >= 1) { argumentType = methodInfo.getArgumentOpcodeType(1); } return methodInfo.getReturnOpcodeType() == 'V' && // void-returning method argumentType == 'I' && // first argument type methodInfo.isTopLevelMethod() && // top-level methodInfo.getMethodName().startsWith("set") && // set* (argumentsCount == 2 || argumentsCount == 3); // number of arguments } })); } return proxetta; }
@Test void testInterfaceWrapper() throws Exception { Calc calc = new CalcImpl(); WrapperProxetta proxetta = Proxetta.wrapperProxetta().withAspect(new ProxyAspect(StatCounterAdvice.class, methodInfo -> methodInfo.isTopLevelMethod() && methodInfo.isPublicMethod())); //proxetta.setDebugFolder("/Users/igor"); // wrapper over INTERFACE // resulting object has ONE interface // only interface methods are wrapped WrapperProxettaFactory builder = proxetta.proxy().setTarget(Calc.class).setTargetProxyClassName(".CalcImpl3"); Class<Calc> calc2Class = builder.define(); Calc calc2 = calc2Class.newInstance(); builder.injectTargetIntoWrapper(calc, calc2); assertEquals(1, StatCounter.counter); // counter in static block !!! calc2.hello(); assertEquals(2, StatCounter.counter); assertEquals(10, calc2.calculate(3, 7)); assertEquals(3, StatCounter.counter); try { calc2Class.getMethod("customMethod"); fail("error"); } catch (Exception ex) { } }
@Test void testClassesWithGenericsAsReturnValueWrapper() { 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) { fail(ex.toString()); } }
/** * 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 })); }
protected T wrap(final T preparedStatement, final String sql) { if (wrappedStatement == null) { builder = proxetta.proxy();
/** * Defines if target should be created in ctor, so no additional injection is required. */ public WrapperProxetta setCreateTargetInDefaultCtor(final boolean createTargetInstanceInDefaultCtor) { this.createTargetInDefaultCtor = createTargetInstanceInDefaultCtor; return _this(); }
public WrapperProxettaBuilder builder(Class targetClassOrInterface, Class targetInterface) { WrapperProxettaBuilder builder = builder(); builder.setTarget(targetClassOrInterface); builder.setTargetInterface(targetInterface); return builder; }
WrapperProxetta proxetta = Proxetta.wrapperProxetta().withAspect(new ProxyAspect(StatCounterAdvice.class, methodInfo -> methodInfo.isPublicMethod() && (methodInfo.getMethodName().equals("hello") || methodInfo.getMethodName().equals("ola")))); WrapperProxettaFactory builder = proxetta.proxy().setTarget(CalcSuper.class);
Calc calc = new CalcImpl(); WrapperProxetta proxetta = Proxetta.wrapperProxetta().withAspects(new ProxyAspect(StatCounterAdvice.class, methodInfo -> !methodInfo.isRootMethod() && methodInfo.isPublicMethod())); WrapperProxettaFactory builder = proxetta.proxy().setTarget(calc.getClass());