Oops, The format is not good for read, And looks like I can't modify
it. Sorry.

On Nov 24, 10:10 am, "[EMAIL PROTECTED]" <[EMAIL PROTECTED]>
wrote:
> Hi, Guys,
>
> Aspect-Oriented Programming for GWT, GWTENT-0.5 now available for
> download.
> Please see here or read through this post for more 
> information:http://code.google.com/p/gwt-ent/wiki/AOP
> You can get all interceptors in sample project 
> athttp://gwt-ent.googlecode.com/svn/trunk/gwtent-sample/src/com/gwtent/...
> Please download the sample project 
> athttp://code.google.com/p/gwt-ent/downloads/list
>
> If you get anything, any advises, issues, please let me know, let us
> make it better. :D
>
> 1, Introduction
>
>     Now Aspect-Oriented Programming is available in GWT.
>
>     The following advice type supported by GWTENT(Compatible with
> AspectJ annotation).
>
>        1. @Around
>        2. @Before
>        3. @After
>        4. @AfterReturning?
>        5. @AfterThrowing?
>
>     * Around advice: Advice that surrounds a join point such as a
> method invocation. This is the most powerful kind of advice. Around
> advice can perform custom behavior before and after the method
> invocation. It is also responsible for choosing whether to proceed to
> the join point or to shortcut the advised method execution by
> returning its own return value or throwing an exception.
>     * Before advice: Advice that executes before a join point, but
> which does not have the ability to prevent execution flow proceeding
> to the join point (unless it throws an exception).
>     * After (finally) advice: Advice to be executed regardless of the
> means by which a join point exits (normal or exceptional return).
>     * After returning advice: Advice to be executed after a join point
> completes normally: for example, if a method returns without throwing
> an exception.
>     * After throwing advice: Advice to be executed if a method exits
> by throwing an exception.
>
>     And for pointcut, we support both Google Guice matcher classes and
> AspectJ expression(a subset of AspectJ expression)
>
>     Please see here for all interceptors in sample project. Please
> download the sample projecthere
>
> 2, Pointcut
> 2.1, Overview
>
> Pointcut: A predicate that matches join points. Advice is associated
> with a pointcut expression and runs at any join point matched by the
> pointcut (for example, the execution of a method with a certain name).
> The concept of join points as matched by pointcut expressions is
> central to AOP: we support AspectJ pointcut language and Google Guice
> matcher classes.
> 2.1.1, Client-side code?
>
>     Please note, All pointcut match code is runing at compile time,
> it's mean you can write truely java code in your matcher class and
> without any limit in GWT client-side code. In compile time and host-
> mode, GWTENT require AspectJ jars to dealwith AspectJ expression, but
> after your compile it, all are javascript.
>
> 2.2, AspectJ pointcut expression style
>
>     to be continue
>
> 2.2, Google Guice matcher style
>
>     We support "matchclass(the class name which implement
> com.gwtent.aop.matcher.ClassMethodMatcher?)", for example:
>
>             @Aspect
>             public static class PhoneRedirectInterceptor {
>
>                     @Around("matchclass
> (com.gwtent.test.aspectj.TestMatcher)")
>                     public Object invoke(MethodInvocation invocation)
> throws Throwable {
>                             invocation.proceed();
>                             System.out.println("Do something in
> PhoneRedirectInterceptor...");
>                             return new Receiver("Alberto's Pizza
> Place");
>                     }
>             }
>
> the matcher class will looks like this:
>
> public class TestMatcher implements ClassMethodMatcher {
>
>         public Matcher<? super Class<?>> getClassMatcher() {
>                 return Matchers.subclassesOf(Phone.class);
>         }
>
>         public Matcher<? super Method> getMethodMatcher() {
>                 return Matchers.returns(Matchers.only
> (Phone.Receiver.class));
>                 //return Matchers.any();
>         }
>
> }
>
> 3, Advice
> 3.1, Arguments Binding
>
>    1. if there is "com.gwtent.client.aop.intercept.MethodInvocation?"
> in args list, then invocation will assign to args.
>    2. if source method and advice method have the same class type and
> this type just have one, then we assign this one to args
>    3. Read settings in @AfterReturning?
>
>               [EMAIL PROTECTED](
>                  pointcut="**",
>                  returning="retVal"
>                  )
>                  public void afterReturning(Object retVal)
>
>    4. Read settings in @AfterThrowing?
>
>               [EMAIL PROTECTED](
>                        throwing="e"
>                }
>                public void afterThrowing(Throwable e)
>
> 3.2, @Around
>
>     Advice that surrounds a join point such as a method invocation.
> This is the most powerful kind of advice. Around advice can perform
> custom behavior before and after the method invocation. It is also
> responsible for choosing whether to proceed to the join point or to
> shortcut the advised method execution by returning its own return
> value or throwing an exception.
>
> 3.2.1, Example
>
>                 @Around("execution(*
> com.gwtent.sample.client.Phone.call(java.lang.Number))")
>                 public Object invoke(MethodInvocation invocation)
> throws Throwable {
>                         invocation.proceed();
>                         System.out.println("Do something in
> PhoneRedirectInterceptor...");
>                         return new Receiver("Alberto's Pizza Place");
>                 }
>
> 3.3, @Before
>
>     Advice that executes before a join point, but which does not have
> the ability to prevent execution flow proceeding to the join point
> (unless it throws an exception).
>
> 3.3.1, Example
>
>                 @Before("execution(*
> com.gwtent.sample.client.Phone.call(java.lang.Number))")
>                 public void beforeCall(MethodInvocation invocation) {
>                         for (Object arg : invocation.getArguments()){
>                                 System.out.println("Do something in
> PhoneLoggerInterceptor, Before...");
>
>                                 if (arg instanceof Number)
>                                         System.out.println("Call to: "
> + arg);
>                         }
>                 }
>
> 3.4, @After
>
>     After (finally) Advice to be executed regardless of the means by
> which a join point exits (normal or exceptional return).
>
> 3.4.1, Example
>
>                 @After("execution(* com.gwtent.sample.client.Phone.call
> (java.lang.Number))")
>                 public void afterCall(MethodInvocation invocation)
> {
>                         for (Object arg : invocation.getArguments()){
>                                 System.out.println("Do something in
> PhoneLoggerInterceptor, After...");
>
>                                 if (arg instanceof Number)
>                                         System.out.println("After
> Call: " + arg);
>                         }
>                 }
>
> 3.5, @AfterReturning?
>
>     Advice to be executed after a join point completes normally: for
> example, if a method returns without throwing an exception.
>
> 3.5.1, Example
>
>                 @AfterReturning(pointcut = "execution(*
> com.gwtent.sample.client.Phone.call(java.lang.Number))",
>                         returning = "returnValue")
>                 public void afterReturningCall(MethodInvocation
> invocation, Object returnValue) {
>                         System.out.println("Do something in
> PhoneLoggerInterceptor, AfterReturning...");
>
>                         if ((returnValue != null)){
>                                 if (returnValue instanceof Number)
>                                         System.out.println("Returning
> Number: " + returnValue.toString());
>                                 else
>                                         System.out.println("Returning
> Object: " + returnValue.toString());
>                         }else{
>                                 System.out.println("Returning Object
> is NULL?");
>                         }
>                 }
>
> 3.6, @AfterThrowing?
>
>     Advice to be executed if a method exits by throwing an exception.
>
> 3.6.1, Example
>
>                 @AfterThrowing(pointcut="execution(*
> com.gwtent.sample.client.Phone.call(java.lang.Number))",
>                                 throwing="e")
>                 public void phoneCallErrorLog(MethodInvocation
> invocation, Throwable e){
>                         System.out.println("PhoneCallErrorLog: " +
> e.getMessage());
>                 }
>
> 4, The whole example
> Class
>
> The normal gwt class, for now you need implement "Aspectable" mark
> interface
>
> public class Phone implements Aspectable {
>         private static final Map<Number, Receiver> RECEIVERS = new
> HashMap<Number, Receiver>();
>
>         static {
>                 RECEIVERS.put(123456789, new Receiver("Aunt Jane"));
>                 RECEIVERS.put(111111111, new Receiver("Santa"));
>         }
>
>         /**
>          * the phone number, like your home number
>          */
>         private Number number;
>
>         public Receiver call(Number number) {
>                 System.out.println("The call here...");
>                 Receiver result = RECEIVERS.get(number);
>                 if (result != null)
>                         return result;
>                 else
>                         throw new NumberNotFoundException("Can't
> found receiver, number: " + number);
>         }
>
>         public Receiver call(String number){
>                 System.out.println("The call here...");
>                 return RECEIVERS.get(111111111);
>         }
>
>         public String toString(){
>                 return super.toString();
>         }
>
>         public void setNumber(Number number) {
>                 this.number = number;
>         }
>
>         public Number getNumber() {
>                 return number;
>         }
>
>         public static class NumberNotFoundException extends
> RuntimeException{
>
>                 /**
>                  *
>                  */
>                 private static final long serialVersionUID = 1L;
>
>                 public NumberNotFoundException(String msg){
>                         super(msg);
>                 }
>
>         }
>
>         public static class Receiver {
>                 private final String name;
>
>                 public Receiver(String name) {
>                         this.name = name;
>                 }
>
>                 @Override
>                 public String toString() {
>                         return getClass().getName() + "[name=" + name
> + "]";
>                 }
>         }
>
> Aspect Classes
>
>         @Aspect
>         public static class PhoneLoggerInterceptor {
>
>                 //execution(modifiers-pattern? ret-type-pattern
> declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
>                 @Before("execution(*
> com.gwtent.client.test.aop.Phone.call(java.lang.Number))")
>                 public void beforeCall(MethodInvocation invocation) {
>                         for (Object arg : invocation.getArguments()){
>                                 System.out.println("Do something in
> PhoneLoggerInterceptor, Before...");
>
>                                 if (arg instanceof Number)
>                                         System.out.println("Call to: "
> + arg);
>                         }
>                 }
>
>                 @AfterReturning(pointcut = "execution(*
> com.gwtent.client.test.aop.Phone.call(java.lang.Number))",
>                         returning = "returnValue")
>                 public void afterReturningCall(MethodInvocation
> invocation, Object returnValue) {
>                         System.out.println("Do something in
> PhoneLoggerInterceptor, AfterReturning...");
>
>                         if ((returnValue != null)){
>                                 if (returnValue instanceof Number)
>                                         System.out.println("Returning
> Number: " + returnValue.toString());
>                                 else
>                                         System.out.println("Returning
> Object: " + returnValue.toString());
>                         }else{
>                                 System.out.println("Returning Object
> is NULL?");
>                         }
>                 }
>
>                 @After("execution(* com.gwtent.sample.client.Phone.call
> (java.lang.Number))")
>                 public void afterCall(MethodInvocation invocation)
> {
>                         for (Object arg : invocation.getArguments()){
>                                 System.out.println("Do something in
> PhoneLoggerInterceptor, After...");
>
>                                 if (arg instanceof Number)
>                                         System.out.println("After
> Call: " + arg);
>                         }
>                 }
>         }
>
>         @Aspect
>         public static class PhoneRedirectInterceptor {
>
>                 @Around("execution(*
> com.gwtent.client.test.aop.Phone.call(java.lang.Number))")
>                 public Object invoke(MethodInvocation invocation)
> throws Throwable {
>                         invocation.proceed();
>                         System.out.println("Do something in
> PhoneRedirectInterceptor...");
>                         return new Receiver("Alberto's Pizza Place");
>                 }
>         }
>
> Using it
>
>   public void testAOP(){
>         Phone phone = (Phone) GWT.create(Phone.class);
>         Receiver auntJane = phone.call(123456789);
>         System.out.println(auntJane);
>   }
>
> The Result - System Output
>
> Do something in PhoneLoggerInterceptor, Before...
> Call to: 123456789
> Validate, you cann't dail to 0, current Number(most time it's null):
> null
> The call here...
> Do something in PhoneRedirectInterceptor...
> Do something in PhoneLoggerInterceptor, After...
> After Call: 123456789
> Do something in PhoneLoggerInterceptor, AfterReturning...
> Returning Object: com.gwtent.sample.client.Phone$Receiver
> [name=Alberto's Pizza Place]
> com.gwtent.sample.client.Phone$Receiver[name=Alberto's Pizza Place]
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to Google-Web-Toolkit@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/Google-Web-Toolkit?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to