Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-users] Quick Question

How would I fashion a point cut that matched a method invocation only if it had not already been applied to an overridden form of that method in a superclass? For instance in one project I have:

public class SimpleQuery{

	public void appendConstraints(){
		..add default constraints..
	}

}

public interface SuppressableQuery{

	...some stuff relevant to suppression...

}

public aspect SuppressableQueryAspect{

void around(SuppressableQuery query) : execution(protected void SimpleQuery.appendConstraints()) && this(query) {
		/* Not really important what this does, just when it is applied */
		if(query.getSuppressed() != null){
			query.addClause(
(query.getSuppressed() ? "" : "NOT ") + "EXISTS (SELECT suppression.partitionId " +
					"FROM " + query.getSuppressionType().getName() +
" suppression WHERE suppression.partitionId IN (:suppressionOrder) " + "AND suppression.entity = " + query.getSuppressedEntityField() + ")");
			query.addParameter("suppressionOrder", query.getSuppressionOrder());
		}
		proceed(query);
	}

}

Then in another project with a jar containing the jar from the first project on the aspect path:

public class ProfileQuery extends SimpleQuery<Profile> implements
        PartitionedQuery<Profile>, SuppressableQuery<Profile> {

	@Override
	protected void appendConstraints() {
		super.appendConstraints();
		if(onetOccupationStub != null){
			addClause(alias("delegate") + " = :onetOccupationStub");
			addParameter("onetOccupationStub", onetOccupationStub);
		}
	}

}

What I'm seeing is that the clause is added to the query twice, when I only want it to match one invocation of appendConstraints, in this case the one in ProfileQuery. Can that be done?


Back to the top