2012-08-30 1 views
0

Я разрабатываю проект rcp с несколькими плагинами, и я использую AJDT aspectJ для целей ведения журнала в приложении. Я создал два аспекта для ведения журнала информации и один для регистрации ошибок в каждом плагине. Аспект отлично работает для базового плагина, но он не работает для другого плагина.Создание аспекта для нескольких плагинов в проекте RCP проекта eclipse

Я имею несколько запросов относительно выше реализации:

  1. это правильный способ определить аспект для каждого плагина, или мы можем создать один аспект для всех плагинов
  2. если имя пакета одинаковы в разные плагины - это проблема при создании отдельного аспекта для каждого плагина.
  3. Я попытался создать один аспект для обычного ведения журнала и регистрации исключений, но не работал для меня. Прикрепление образца для нормального аспекта и аспекта исключения.
  4. Есть ли способ определить аспект без указания имени пакета, я думаю, поскольку я упоминаю имя пакета в pointcut, это создает проблему.

Я получаю ниже ошибки, если имеет один аспект в каждом плагине:

Caused by: org.aspectj.lang.NoAspectBoundException: com_tsystems_rvs_client_gui_user_RvsUserAspect 
at com.tsystems.rvs.client.gui.user.RvsUserAspect.aspectOf(RvsUserAspect.aj:1) 
at com.tsystems.rvs.client.gui.user.RvsUserAspect.<clinit>(RvsUserAspect.aj:27) 

код для нормального аспекта, используемый для информации в журнал Msg

public aspect RvsFrameworkAspect { 


public pointcut scope(): within(com.tsystems.rvs.client.gui.framework.*); 

before() : scope(){ 
    Signature sig=thisJoinPointStaticPart.getSignature(); 
    String infoFormat="Entering ["+sig.getDeclaringType().getName()+"."+sig.getName(); 
    logTrace(infoFormat, thisJoinPointStaticPart, thisEnclosingJoinPointStaticPart); 
} 

after() : scope(){ 
    Signature sig=thisJoinPointStaticPart.getSignature(); 
    String infoFormat="Leaving ["+sig.getDeclaringType().getName()+"."+sig.getName()+"]"; 
    logTrace(infoFormat, thisJoinPointStaticPart, thisEnclosingJoinPointStaticPart); 
} 
protected synchronized void logTrace(String info, StaticPart location, 
     StaticPart enclosing) { 

     Signature signature = location.getSignature(); 

     String source = signature.getDeclaringTypeName() + ":" + 
      (enclosing.getSourceLocation().getLine()); 
     LoggerMode.getInstance().logInfo(" " + source + " - " + info); 


} 

} 

код исключения войти плагин

public aspect RvsFrameworkExceptionAspect { 

public pointcut scope(): within(com.tsystems.rvs..*); 
private Map<Throwable, String> loggedThrowables = new WeakHashMap<Throwable, String>(); 

after() throwing(Throwable t): scope() { 

    logThrowable(t, thisJoinPointStaticPart, 
      thisEnclosingJoinPointStaticPart); 
    } 

before (Throwable t): handler(Exception+) && args(t) && scope() { 

    logThrowable(t, thisJoinPointStaticPart, 
      thisEnclosingJoinPointStaticPart); 
    } 
protected synchronized void logThrowable(Throwable t, StaticPart location, 
     StaticPart enclosing) { 

    if (!loggedThrowables.containsKey(t)) { 
     loggedThrowables.put(t, null); 

     Signature signature = location.getSignature(); 

     String source = signature.getDeclaringTypeName() + ":" 
       + (enclosing.getSourceLocation().getLine()); 


      LoggerMode.getInstance().logError(" " + source + " - " + t.toString(), t); 

    } 
} 

Пожалуйста, помогите мне, что я делаю неправильно в моей реализации.

ответ

1

Возможно, ваш pointcut в RvsFrameworkExceptionAspect просто советует классы, которые вы хотите исключить. В частности,

within(com.tsystems.rvs..*)

будет соответствовать

com.tsystems.rvs.client.gui.user.RvsUserAspect,

т.е. вы советуете еще один аспект, как это кажется. Постарайтесь быть немного более конкретными о том, что вы хотите перехватить.


Редактировать относительно вашего дополнительный вопрос в комментарии:

Вы можете попробовать это, если ваши аспекты все имеют имена классов, заканчивающиеся «Аспект»:

within(com.tsystems.rvs..*) && !within(*..*Aspect)

В противном случае вам может исключать отдельные классы аспектов или просто включать меньше неаспектных классов, что проще в вашем случае. Как правило, трудно дать полезные подсказки, не зная полной базы кода, поэтому, пожалуйста, поймите, что я не мог попасть в цель так, как вы пожелаете. ;-)

+0

не могли бы вы направить мне пример. – Gaurav

+0

Я отредактировал ответ и надеюсь, что это поможет. – kriegaex

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

  • Нет связанных вопросов^_^