tutorial - eclipse oxygen aspectj
AspectJ: parámetro en un corte de punto (4)
Oh, bueno ... trabajé en eso con este truco desagradable. Todavía estoy esperando que alguien aparezca con una definición de punto de corte "oficial".
pointcut permissionCheckMethods(EhealthSession eheSess) :
(execution(public * *(.., EhealthSession)) && args(*, eheSess))
&& !within(it.___.security.PermissionsCheck);
pointcut permissionCheckMethods2(EhealthSession eheSess) :
(execution(public * *(EhealthSession)) && args(eheSess))
&& !within(it.___.security.PermissionsCheck)
&& !within(it.___.app.impl.EhealthApplicationImpl);
before(EhealthSession eheSess) throws AuthorizationException : permissionCheckMethods(eheSess)
{
Signature sig = thisJoinPointStaticPart.getSignature();
check(eheSess, sig);
}
before(EhealthSession eheSess) throws AuthorizationException : permissionCheckMethods2(eheSess)
{
Signature sig = thisJoinPointStaticPart.getSignature();
check(eheSess, sig);
}
Estoy usando AspectJ para asesorar a todos los métodos públicos que tienen un argumento de una clase elegida. Intenté lo siguiente:
pointcut permissionCheckMethods(Session sess) :
(execution(public * *(.., Session)) && args(*, sess));
Esto funciona maravillosamente para los métodos con al menos 2 argumentos:
public void delete(Object item, Session currentSession);
pero no funciona con métodos como:
public List listAll(Session currentSession);
¿Cómo puedo cambiar mi punto de corte para asesorar ambas ejecuciones de métodos? En otras palabras: esperaba que el comodín ".." representara "cero o más argumentos", pero parece que significa "uno o más" ...
Qué tal si:
pointcut permissionCheckMethods(Session sess) :
(execution(public * *(..)) && args(.., sess));
Supongo que esto coincidirá si el último (o único) argumento es de tipo Session. Al intercambiar las posiciones de args también puede coincidir primero o solo. Pero no sé si es posible combinar cualquier posición arbitraria.
No puedo extender la sintaxis de AspectJ por ti, pero puedo ofrecerte una solución alternativa. Pero primero permítame explicar por qué no es posible hacer lo que quiere con una definición de args
en un punto: porque si EhealthSession
su parámetro EhealthSession
cualquier lugar dentro de la firma del método, ¿cómo debe manejar AspectJ el caso de que la firma contenga múltiples parámetros de ¿esa clase? El significado de eheSess
sería ambiguo.
Ahora la solución: puede ser más lenta, cuánto depende de su entorno, simplemente pruébela, pero podría hacer que el punto coincida con todos los métodos posibles independientemente de su lista de parámetros y luego deje que el consejo encuentre el parámetro que necesita inspeccionando el parámetro lista:
pointcut permissionCheckMethods() : execution(public * *(..));
before() throws AuthorizationException : permissionCheckMethods() {
for (Object arg : thisJoinPoint.getArgs()) {
if (arg instanceof EhealthSession)
check(arg, thisJoinPointStaticPart.getSignature());
}
}
PD: Tal vez pueda restringir el enfoque a través de within(SomeBaseClass+)
o within(*Postfix)
o within(com.company.package..*)
para no aplicar el consejo a todo el universo.
Debe usar .. (puntos dobles) al final y al principio de la siguiente manera:
pointcut permissionCheckMethods(Session sess) :
(execution(public * *(.., Session , ..)) );
También libérate de && args(*, sess)
porque eso significa que esperas capturar solo aquellos métodos con cualquier tipo para el primer param pero sess
como segundo param y no más de 2 params también.