2015-07-20 2 views
0

Я пытаюсь разработать простую червоточину с использованием AspectJ и cflow.Как реализовать шаблон Wormhole с AspectJ (cflow)

У меня есть два значения объектов Person и счета, как показано ниже

СЧЕТ

public class Account { 

    private final String sortCode; 
    private final String accountNumber; 
    private final int balance; 

    public Account(String sortCode, String accountNumber, int balance) { 
     this.sortCode = sortCode; 
     this.accountNumber = accountNumber; 
     this.balance = balance; 
    } 

    public String getSortCode() { 
     return sortCode; 
    } 

    public String getAccountNumber() { 
     return accountNumber; 
    } 

    public int getBalance() { 
     return balance; 
    } 

    @Override 
    public String toString() { 
     return "Account{" + 
       "sortCode='" + sortCode + '\'' + 
       ", accountNumber='" + accountNumber + '\'' + 
       ", balance=" + balance + 
       '}'; 
    } 
} 

Person

public class Person { 

    private final String name; 
    private final String address; 
    private final int age; 

    public Person(String name, String address, int age) { 
     this.name = name; 
     this.address = address; 
     this.age = age; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getAddress() { 
     return address; 
    } 

    public int getAge() { 
     return age; 
    } 

    @Override 
    public String toString() { 
     return "Person{" + 
       "name='" + name + '\'' + 
       ", address='" + address + '\'' + 
       ", age=" + age + 
       '}'; 
    } 
} 

И три "Слои"

слоя А

public class Layer_A { 

    public void doSomeLevelAprocess(Person person){ 

     System.out.println("doSomeLevelAprocess person " + person); 
     new Layer_B().doSomeLevelBprocess(); 

    } 
} 

слой В

public class Layer_B { 

    public void doSomeLevelBprocess(){ 

     System.out.println("doSomeLevelBprocess"); 
     new Layer_C().doSomeLevelCprocess(new Account("123456", "87654321", 1001)); 

    } 
} 

слой С

public class Layer_C { 

    public void doSomeLevelCprocess(Account account){ 

     System.out.println("doSomeLevelCprocess "); 

    } 
} 

Я хотел бы иметь Person объект то будет передано Layer_A методы doSomeLevelAprocess, доступный на Layer_C метод doSomeLevelCprocess

Возможно ли это?

мой аспект выглядит это

public aspect WormWhole { 

    pointcut callerSpace(Person person): execution(* Layer_A.*(..)) && this(person); 

    pointcut calleeSpace(Account account): this(account) && execution(public * Layer_C.*(..)); 

    pointcut wormhole(Person person, Account account): 
      cflow(callerSpace(person)) && calleeSpace(account); 

    before(Person person, Account account): 
      wormhole(person, account){ **//WHAT DO I DO HERE?????** } 
} 

Отобрали I callerSpace и срезов в calleeSpace правильно?

Какая логика требуется

before(Person person, Account account): 
       wormhole(person, account){ **//WHAT DO I DO HERE?????** } 

UPDATE

«возможного Дубликат» вопрос на самом деле не показывают, как достичь червоточину, он просто показывает «шаблон» для червоточины AspectJ , Кроме того, ответ на заданный вопрос не пытается передать контекст через несколько слоев, что является всей точкой червоточины.

UPDATE

Когда я изменить советы это: -

public aspect WormWhole { 

    pointcut callerSpace(Person person): execution(* Layer_A.*(..)) && this(person); 

    pointcut calleeSpace(Account account): this(account) && execution(public * Layer_C.*(..)); 

    pointcut wormhole(Person person, Account account): 
      cflow(callerSpace(person)) && calleeSpace(account); 

    before(Person person, Account account): 
      wormhole(person, account){ 
     System.out.println("Wormhole - " + person); 
     System.out.println("Wormhole - " + account); 


    } 
} 

Я получаю этот выход: -

doSomeLevelAprocess person Person{name='aaa', address='aaa', age=19} 
doSomeLevelBprocess 
doSomeLevelCprocess 

Process finished with exit code 0 

Это доказывает мои срезов в не правильно (я считаю,), но почему????

UPDATE

Я добавил в простой срезом точек, который отлично работает

public aspect WormWhole { 

    pointcut callSayHello(): call(* Layer_A.*(..)) || call(* Layer_B.*(..)) || call(* Layer_C.*(..)) ; 

    pointcut callerSpace(Person person): execution(* Layer_A.*(..)) && this(person); 

    pointcut calleeSpace(Account account): this(account) && execution(public * Layer_C.*(..)); 

    pointcut wormhole(Person person, Account account): 
      cflow(callerSpace(person)) && calleeSpace(account); 

    before(Person person, Account account): 
      wormhole(person, account){ 
     System.out.println("Wormhole - " + person); 
     System.out.println("Wormhole - " + account); 


    } 

    after() : callSayHello() { 
     System.out.println("After call sayHello" + thisJoinPoint); 
    } 
} 

Выход из выполнения теста

doSomeLevelAprocess person aaa 
doSomeLevelBprocess 
doSomeLevelCprocess account 87654321 
After call sayHellocall(void Layer_C.doSomeLevelCprocess(Account)) 
After call sayHellocall(void Layer_B.doSomeLevelBprocess()) 
After call sayHellocall(void Layer_A.doSomeLevelAprocess(Person)) 

Process finished with exit code 0 

Я использую караты в IntelliJ 14.1.14 с aspectjrt-1.8.6.jar

+0

возможный дубликат [Реализация шаблона червоточины с использованием AspectJ] (http://stackoverflow.com/questions/12129562/implementing-a-wormhole-pattern -using-aspectj) –

+0

Этот вопрос/ответ (ы) не объясняет, КАК достичь желаемого результата. Также, что код примера вопросов не имеет нескольких слоев для прохождения через – Hector

+0

Я тот, кто ответил на другой вопрос. Я на самом деле не пытался запускать ваш код, но на первый взгляд pointcuts выглядят хорошо. Что касается вашей озабоченности по поводу количества уровней, это просто не имеет значения - вот в чем суть червячной схемы. Что касается вашего вопроса «что мне здесь делать?» - Ну, это зависит от вас. Попробуйте напечатать два объекта, например. Если вы можете их распечатать, вы также можете сделать с ними что-нибудь еще. Это зависит только от того, чего вы хотите достичь. Что бы вы ни делали, в основном вы используете объект 'Person' в контексте выполнения объекта' Account' - круто, не так ли? – kriegaex

ответ

1

Вы правы, вы получили что-то не так с вашими, который срезами в поэтому компилятор AspectJ показывает следующее предупреждение:

advice defined in Wormhole has not been applied [Xlint:adviceDidNotMatch] 

Причина проста: Вы пытаетесь связать свои аргументы метода с помощью this() вместо args(). Таким образом, оба pointcut не могут совпадать, поскольку объекты this в двух контекстах исполнения являются экземплярами Layer_A и Layer_C, а не Person и Account.

Это небольшое изменение исправляет червоточины картины аспект:

pointcut callerSpace(Person person) : 
    execution(* Layer_A.*(..)) && args(person); 

pointcut calleeSpace(Account account) : 
    execution(public * Layer_C.*(..)) && args(account); 
+0

спасибо, так много, такая простая ошибка. – Hector

Смежные вопросы