2016-12-19 12 views
0

У нас есть гибридное приложение RCP 3/4 и обработчик, определенный в фрагменте.e4xmi.Eclipse RCP, когда создан Handler?

<fragments xsi:type="fragment:StringModelFragment" xmi:id="_X7-AID93EeKXHI5xGhqnKg" featurename="handlers" parentElementId="org.eclipse.[..].application"> 
<elements xsi:type="commands:Handler" [..]/> 
<elements xsi:type="commands:Handler" xmi:id="_jx8voD93EeKXHI5xGhqnKg" elementId="[..].ui.handler.addToDatabase" contributionURI="bundleclass://[..].ui/[..].ui.handlers.AddToDatabaseHandler" command="_TlV-ID93EeKXHI5xGhqnKg"/> 
<elements xsi:type="commands:Handler" [..]/> 

public class AddToDatabaseHandler implements EventHandler { 

    private ISelectionMSD selection; 

    public AddToDatabaseHandler() { 
     System.err.println("Created " + this); 
    } 

    @Execute 
    public void execute(@Named(IServiceConstants.ACTIVE_PART) MPart part) { 

     System.err.println(this + ": Execute, selection is " + selection); 

     if(selection != null) { 
      // do something 
     } 
    } 

    @Override 
    public void handleEvent(Event event) { 

     if(event.getTopic().equals(UPDATE_SELECTION)) { 
      selection = (ISelectionMSD)event.getProperty(IEvents.PROPERTY_SELECTION); 
      System.err.println(this + ": Handle event, selection is " + selection); 
     } 
    } 
} 

Я добавил некоторые System.err и я могу видеть, что два экземпляра этого обработчика создаются неявно с помощью DI/отражения.

1) Есть ли легкое объяснение при создании экземпляра этого обработчика?

2) первый созданный экземпляр (справа при запуске платформы) пропускает события, для которых этот класс прослушивает. Поэтому он не добавляется в EventAdmin в качестве прослушивателя событий. Могу ли я отлаживать это как-то?

3) Его кажется мне «волшебным», когда и где и как регистрируется второй класс для прослушивания событий? Это делается где-то на платформе или я просто пропустил часть нашего собственного кода?

Большое спасибо за помощь!

ответ

2

Я не уверен, что вы подразумеваете под гибридным приложением 3/4.

Обработчик e4 только выполняет метод @Execute@CanExecute), не ожидается реализовать EventHandler и ничего не будет искать это или вызвать метод.

Если вы хотите обрабатывать события с помощью @EventTopic или @UIEventTopic

@Inject 
@Optional 
public void handleEvent(@EventTopic("topic id") Event event) 
+0

Большое спасибо за подсказку! Я не знаю, как и почему, но используя аннотированный метод, событие правильно обрабатывается в обоих объектах. Я до сих пор не знаю, почему создаются два экземпляра, но, что самое важное, теперь он согласован;) С «гибридом» я имею в виду, что у нас есть фрагмент.4xmi плюс мы используем plugin.xml и точки расширения. – kerner1000

+0

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

+0

Проблема решена. Класс обработчика также был зарегистрирован как служба OSGi (EventHandler) через xml, поэтому два экземпляра. Я реорганизовал его с помощью предложенных аннотаций и удалил определение OSGi Service, которое работает так, как ожидалось. Большое спасибо! – kerner1000