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.
@Before( "aspectInitialized() && cflowbelow(ejbMethods()) && !cflowbelow(userAccountOwner()) && (newModelsWhichReferenceUserA() || (userAccountAccessibleMethods() ))")
public void preventConstructorsForRelatedObjects(JoinPoint joinPoint) throws SecurityAccessTableDataException{
// 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)
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.