Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Are there limitations of combining multiple cflow() together or using cflow with get pointcut?

Hi Eric.

You understand something here.

    get(* model.UserAccount.accountOwner)

is in the control flow of 

    execution(* model.UserAccount.getAccountOwner(..))

but not the other way around. The control flow of reading the member
value starts right before it is read and ends right after it has been
read. It is a pretty much atomic operation. Whatever other methods are
called by the getter *method* are not yet or no longer within the
control flow of the member read operation. I can explain in more detail
if you provide the code of UserAccount.getAccountOwner().

Regards
--
Alexander Kriegisch
https://scrum-master.de

Eric B schrieb am 25.11.2018 19:59:
> 
> 
> I've tried to write a pointcut that combines a couple of different
> cflow()/cflowbelow() together, but it does not seem to work as expected.
> That is, the advise is still being executed even though one of the cflow()
> pointcuts is clearly in the stacktrace.
> 
> 
> My pointcut in question is:
> 
> > @Pointcut("get(* model.UserAccount.accountOwner)")
> public voiduserAccountOwner(){}
> 
>
> 
> 
> I then use the defined pointcut as:
> 
> > @Before("aspectInitialized() && cflowbelow(ejbMethods()) &&
> !cflowbelow(userAccountOwner()) && (newModelsWhichReferenceUserA() ||
> (userAccountAccessibleMethods() ))")
> public voidpreventConstructorsForRelatedObjects(JoinPoint
> joinPoint)throwsSecurityAccessTableDataException{
>
> > // some logic
>
> > throw new RuntimeException( "USERA tables not yet ready");
>
> > }
>
> 
> And in my stack trace in which the advice is clearly being executed (the
> GeneralException is being triggered by an exception thrown in the advice),
> I can observe the UserAccount.getAccountOwner() method being called.
> 
> 
> Caused by: <0|false|0.9.5-incubating> kodo.jdo.GeneralException: USERA
> tables are not yet ready
> 
> at org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:852)
> 
> at org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:749)
> 
> at
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.find(JDBCStoreManager.java:746)
> 
> at
> org.apache.openjpa.jdbc.meta.strats.RelationFieldStrategy.load(RelationFieldStrategy.java:550)
> 
> at org.apache.openjpa.jdbc.meta.FieldMapping.load(FieldMapping.java:791)
> 
> at
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:483)
> 
> at
> org.apache.openjpa.kernel.DelegatingStoreManager.load(DelegatingStoreManager.java:113)
> 
> at
> org.apache.openjpa.datacache.DataCacheStoreManager.load(DataCacheStoreManager.java:363)
> 
> at
> org.apache.openjpa.kernel.DelegatingStoreManager.load(DelegatingStoreManager.java:113)
> 
> at org.apache.openjpa.kernel.ROPStoreManager.load(ROPStoreManager.java:75)
> 
> at
> org.apache.openjpa.kernel.StateManagerImpl.loadFields(StateManagerImpl.java:2742)
> 
> at
> org.apache.openjpa.kernel.StateManagerImpl.loadField(StateManagerImpl.java:2820)
> 
> at
> kodo.kernel.ProfilingStateManager.loadField(ProfilingStateManager.java:68)
> 
> at
> org.apache.openjpa.kernel.StateManagerImpl.beforeAccessField(StateManagerImpl.java:1337)
> 
> at
> kodo.kernel.ProfilingStateManager.beforeAccessField(ProfilingStateManager.java:49)
> 
> at
> org.apache.openjpa.kernel.StateManagerImpl.accessingField(StateManagerImpl.java:1322)
> 
> at model.UserAccount.pcGetaccountOwner(UserAccount.java:1)
> 
> ====> at model.UserAccount.getAccountOwner(UserAccount.java:500)
> 
> at
> business.impl.PersistentManipulationUtil.findAccountablePersonWithUserName(PersistentManipulationUtil.java:991)
> 
> at business.impl.EJBUtil.createBusinessContext(EJBUtil.java:120)
> 
> at business.impl.EJBUtil.createBusinessContext(EJBUtil.java:78)
> 
> at
> business.ejb3.base.BaseManagerBean.getBusinessContext(BaseManagerBean.java:410)
> 
> at
> business.ejb3.EnterpriseManagerBean.getEnterpriseWindowThresholds(EnterpriseManagerBean.java:1680)
> 
> 
> Changing the userAccountOwner() pointcut to read:
> 
> > @Pointcut("execution(* model.UserAccount.getAccountOwner(..))")
> public voiduserAccountOwner(){}
> 
>
> 
> 
> And the cflow() works as expected.
> 
> 
> Is this behaviour expected based on the way field getter/setter pointcuts
> are designed to work or is this a bug in my code (or my use of the field
> getter) or AspectJ?
> 
> 
> This is with AspectJ 1.8.13.
> 
> 
> Thanks,
> 
> 
> Eric
> 
>



Back to the top