2016-12-19 1 views
0

우리는 RCP 3/4 하이브리드 애플리케이션과 fragment.e4xmi에 정의 된 핸들러를 가지고 있습니다. Eclipse RCP, 핸들러는 언제 만들어 집니까?

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); 
     } 
    } 
} 

<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" [..]/> 

는 좀 System.err에 추가 나는이 Handler의 두 인스턴스가 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

많은 감사를 사용하여 처리하는 경우! 방법이나 이유를 알 수는 없지만 주석 처리 된 메서드를 사용하면 두 개체에서 이벤트가 제대로 처리됩니다. 여전히 왜 두 인스턴스가 만들어 졌는지는 모르겠지만 가장 중요하게는 일관성이 있습니다.) "하이브리드"라는 말은 우리가 fragment.4xmi plus를 가지고 플러스 plugin.xml과 확장 점을 사용한다는 것을 의미합니다. – kerner1000

+0

핸들러가 여러 번 생성 될 수있는 몇 가지 이유가 있습니다. 예를 들어 파트에 대해 정의 된 핸들러가있는 경우 파트가 작성 될 때마다 작성됩니다. –

+0

문제가 해결되었습니다. 또한 핸들러 클래스는 xml을 통해 OSGi Service (EventHandler)로 등록되었으므로 두 인스턴스가 있습니다. 제안 된 주석을 사용하여 리팩토링했으며 예상대로 작동하는 OSGi 서비스 정의를 삭제했습니다. 많은 감사합니다! – kerner1000

관련 문제