<chapter id="miscellaneous" xreflabel="Miscellaneous Changes"> <title>Other Changes in AspectJ 5</title> <sect1 id="pointcuts"> <title>Pointcuts</title> <para> AspectJ 5 is more liberal than AspectJ 1.2.1 in accepting pointcut expressions that bind context variables in more than one location. For example, AspectJ 1.2.1 does not allow: </para> <programlisting><![CDATA[ pointcut foo(Foo foo) : (execution(* *(..)) && this(foo) ) || (set(* *) && target(foo)); ]]></programlisting> <para> whereas this expression is permitted in AspectJ 5. Each context variable must be bound exactly once in each branch of a disjunction, and the disjunctive branches must be mutually exclusive. In the above example for instance, no join point can be both an execution join point and a set join point so the two branches are mutually exclusive. </para> </sect1> <sect1 id="declare-soft"> <title>Declare Soft</title> <para> The semantics of the <literal>declare soft</literal> statement have been refined in AspectJ 5 to only soften exceptions that are not already runtime exceptions. If the exception type specified in a declare soft statement is <literal>RuntimeException</literal> or a subtype of <literal>RuntimeException</literal> then a new XLint warning will be issued:</para> <programlisting><![CDATA[ declare soft : SomeRuntimeException : execution(* *(..)); >> "SomeRuntimeException will not be softened as it is already a RuntimeException" [XLint:runtimeExceptionNotSoftened] ]]></programlisting> <para> This XLint message can be controlled by setting the <literal>runtimeExceptionNotSoftened</literal> XLint parameter. </para> <para> If the exception type specified in a declare soft statement is a super type of <literal>RuntimeException</literal> (such as <literal>Exception</literal> for example) then any <emphasis>checked</emphasis> exception thrown at a matched join point, where the exception is an instance of the softened exception, will be softened to an <literal>org.aspectj.lang.SoftException</literal>. </para> <programlisting><![CDATA[ public aspect SoftenExample { declare soft : Exception : execution(* Foo.*(..)); } class Foo { public static void main(String[] args) { Foo foo = new Foo(); foo.foo(); foo.bar(); } void foo() throws Exception { throw new Exception(); // this will be converted to a SoftException } void bar() throws Exception { throw new RuntimeException(); // this will remain a RuntimeException } } ]]></programlisting> </sect1> </chapter>