eclipse-platform / eclipse-platform/eclipse.platform

Add public API to inject the local IEclipseContext

Aperta
#344 5 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
Java
Stelle
165
Fork
174
Merge medio
2g 8h
PR unite (30g)
22

Descrizione

## Use Case

I want to write an Eclipse 4 command handler that wraps/decorates another command handler. To that effect, my handler has `@CanExecute` and `@Execute` methods which invoke the wrapped handler's respective `@CanExecute` and `@Execute` methods using `ContextInjectionFactory.invoke` like so:

```java
@Execute
public void execute(IEclipseContext context) {
// Decorator functionality goes here

IEclipseContext localContext = null; // How to obtain this?
ContextInjectionFactory.invoke(decoratee, Execute.class, context, localContext, null));
}
```

Unfortunately, this looses any "local context" the `ContextInjectionFactory`? invoking the above method might have had.

## Suggested Solution

Allow the local context to be injected as well, e.g., by using a `@Named` annotation:

```java
@Execute
public void execute(IEclipseContext context, @Named("local") IEclipseContext localContext) {
// Decorator functionality goes here

ContextInjectionFactory.invoke(decoratee, Execute.class, context, localContext, null));
}
```

## Workarounds

AFAICT, the only way to currently obtain this local context is using an internal API (`org.eclipse.e4.core.internal.contexts.ContextObjectSupplier`):

```java
@Execute
public void execute(IEclipseContext context, ContextObjectSupplier localContextSupplier) {
// Decorator functionality goes here

IEclipseContext localContext = localContextSupplier.getContext(); // internal API :-(
ContextInjectionFactory.invoke(decoratee, Execute.class, context, localContext, null));
}
```

But this is both internal API and also more awkward to use than getting the local context injected directly and not as a supplier.

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Inizia leggendo ContextInjectionFactory e il ContextObjectSupplier interno, in particolare come vengono passati i contesti locali durante l'invocazione. Traccia il percorso di injection esistente e determina come un parametro pubblico per il contesto locale potrebbe preservare tale contesto senza esporre il supplier interno. Il lavoro è completato quando gli handler possono ricevere l'IEclipseContext locale tramite una API pubblica e passarlo a invocazioni annidate.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
java
Ambito
backend-api-design
Tipo di issue
Funzionalità
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.