@Test
  public void testInjectWildCard() {
    IEclipseContext context = EclipseContextFactory.create();
    final Display d = Display.getDefault();

    context.set(Realm.class, DisplayRealm.getRealm(d));
    context.set(
        UISynchronize.class,
        new UISynchronize() {

          @Override
          public void syncExec(Runnable runnable) {
            d.syncExec(runnable);
          }

          @Override
          public void asyncExec(Runnable runnable) {
            d.asyncExec(runnable);
          }
        });

    InjectStarEvent target = ContextInjectionFactory.make(InjectStarEvent.class, context);

    // initial state
    assertEquals(0, target.counter1);
    assertNull(target.data);

    // send event
    helper.sendEvent("e4/test/eventInjection", "sample");

    assertEquals(1, target.counter1);
    assertEquals("sample", target.data);
  }
 @Override
 protected void createGUI(final MUIElement uiRoot) {
   Realm.runWithDefault(
       DisplayRealm.getRealm(display),
       new Runnable() {
         @Override
         public void run() {
           UIStartupTest.super.createGUI(uiRoot);
         }
       });
 }
 @Override
 public void testGetSecondPart_GetContext() {
   // need to wrap this since the renderer will try build the UI for the
   // part if it hasn't been built
   Realm.runWithDefault(
       DisplayRealm.getRealm(display),
       new Runnable() {
         @Override
         public void run() {
           UIStartupTest.super.testGetSecondPart_GetContext();
         }
       });
 }
  @Override
  protected void setUp() throws Exception {
    super.setUp();

    propertyName = "list";
    propertyDescriptor =
        ((IBeanProperty) BeanProperties.list(Bean.class, propertyName)).getPropertyDescriptor();
    bean = new Bean(new ArrayList());

    list =
        BeansObservables.observeList(
            DisplayRealm.getRealm(Display.getDefault()), bean, propertyName);
    beanObservable = (IBeanObservable) list;
  }
  @Override
  protected IEclipseContext createApplicationContext() {
    final IEclipseContext[] contexts = new IEclipseContext[1];
    Realm.runWithDefault(
        DisplayRealm.getRealm(display),
        new Runnable() {
          @Override
          public void run() {
            contexts[0] = UIStartupTest.super.createApplicationContext();
            contexts[0].set(IResourceUtilities.class.getName(), new ResourceUtility());
            contexts[0].set(
                IStylingEngine.class.getName(),
                new IStylingEngine() {
                  @Override
                  public void style(Object widget) {
                    // no-op
                  }

                  @Override
                  public void setId(Object widget, String id) {
                    // no-op
                  }

                  @Override
                  public void setClassname(Object widget, String classname) {
                    // no-op
                  }

                  @Override
                  public CSSStyleDeclaration getStyle(Object widget) {
                    // TODO Auto-generated method stub
                    return null;
                  }

                  @Override
                  public void setClassnameAndId(Object widget, String classname, String id) {
                    // no-op
                  }
                });
          }
        });
    return contexts[0];
  }
  public static void main(String[] args) {
    final Display display = new Display();

    // Set up data binding. In an RCP application, the threading Realm
    // will be set for you automatically by the Workbench. In an SWT
    // application, you can do this once, wrapping your binding
    // method call.
    Realm.runWithDefault(
        DisplayRealm.getRealm(display),
        new Runnable() {
          @Override
          public void run() {
            ViewModel viewModel = new ViewModel();
            Shell shell = new View(viewModel).createShell();

            // The SWT event loop
            while (!shell.isDisposed()) {
              if (!display.readAndDispatch()) {
                display.sleep();
              }
            }
          }
        });
  }
  @Test
  public void testEventInjection() {
    IInjector injector = InjectorFactory.getDefault();
    injector.addBinding(MyBinding.class);

    IEclipseContext context = EclipseContextFactory.create();
    final Display d = Display.getDefault();

    context.set(Realm.class, DisplayRealm.getRealm(d));
    context.set(
        UISynchronize.class,
        new UISynchronize() {

          @Override
          public void syncExec(Runnable runnable) {
            d.syncExec(runnable);
          }

          @Override
          public void asyncExec(Runnable runnable) {
            d.asyncExec(runnable);
          }
        });
    ContextInjectionFactory.setDefault(context);
    InjectTarget target = ContextInjectionFactory.make(InjectTarget.class, context);

    // initial state
    assertEquals(0, target.counter1);
    assertNull(target.string1);
    assertEquals(0, target.counter2);
    assertNull(target.string2);
    assertEquals(1, target.counter3);
    assertNull(target.string3);
    assertNotNull(target.myBinding);

    // send event1
    helper.sendEvent("e4/test/event1", "event1data");

    assertEquals(1, target.counter1);
    assertEquals("event1data", target.string1);
    assertEquals(0, target.counter2);
    assertNull(target.string2);
    assertEquals(1, target.counter3);
    assertNull(target.string3);
    assertNotNull(target.myBinding);

    // send event2
    helper.sendEvent("e4/test/event2", "event2data");

    assertEquals(1, target.counter1);
    assertEquals("event1data", target.string1);
    assertEquals(1, target.counter2);
    assertEquals("event2data", target.string2);
    assertEquals(1, target.counter3);
    assertNull(target.string3);
    assertNotNull(target.myBinding);

    // send event3
    helper.sendEvent("e4/test/event3", "event3data");

    assertEquals(1, target.counter1);
    assertEquals("event1data", target.string1);
    assertEquals(1, target.counter2);
    assertEquals("event2data", target.string2);
    assertEquals(2, target.counter3);
    assertEquals("event3data", target.string3);
    assertNotNull(target.myBinding);

    // send event1 again
    helper.sendEvent("e4/test/event1", "abc");

    assertEquals(2, target.counter1);
    assertEquals("abc", target.string1);
    assertEquals(1, target.counter2);
    assertEquals("event2data", target.string2);
    assertEquals(2, target.counter3);
    assertEquals("event3data", target.string3);
    assertNotNull(target.myBinding);
  }
  public E4Workbench createE4Workbench(
      IApplicationContext applicationContext, final Display display) {
    args = (String[]) applicationContext.getArguments().get(IApplicationContext.APPLICATION_ARGS);

    IEclipseContext appContext = createDefaultContext();
    appContext.set(Display.class, display);
    appContext.set(Realm.class, DisplayRealm.getRealm(display));
    appContext.set(
        UISynchronize.class,
        new UISynchronize() {

          @Override
          public void syncExec(Runnable runnable) {
            if (display != null && !display.isDisposed()) {
              display.syncExec(runnable);
            }
          }

          @Override
          public void asyncExec(Runnable runnable) {
            if (display != null && !display.isDisposed()) {
              display.asyncExec(runnable);
            }
          }
        });
    appContext.set(IApplicationContext.class, applicationContext);

    // This context will be used by the injector for its
    // extended data suppliers
    ContextInjectionFactory.setDefault(appContext);

    // Get the factory to create DI instances with
    IContributionFactory factory = appContext.get(IContributionFactory.class);

    // Install the life-cycle manager for this session if there's one
    // defined
    Optional<String> lifeCycleURI =
        getArgValue(IWorkbench.LIFE_CYCLE_URI_ARG, applicationContext, false);
    lifeCycleURI.ifPresent(
        lifeCycleURIValue -> {
          lcManager = factory.create(lifeCycleURIValue, appContext);
          if (lcManager != null) {
            // Let the manager manipulate the appContext if desired
            ContextInjectionFactory.invoke(lcManager, PostContextCreate.class, appContext, null);
          }
        });

    Optional<String> forcedPerspectiveId =
        getArgValue(PERSPECTIVE_ARG_NAME, applicationContext, false);
    forcedPerspectiveId.ifPresent(
        forcedPerspectiveIdValue ->
            appContext.set(E4Workbench.FORCED_PERSPECTIVE_ID, forcedPerspectiveIdValue));

    String showLocation = getLocationFromCommandLine();
    if (showLocation != null) {
      appContext.set(E4Workbench.FORCED_SHOW_LOCATION, showLocation);
    }

    // Create the app model and its context
    MApplication appModel = loadApplicationModel(applicationContext, appContext);
    appModel.setContext(appContext);

    boolean isRtl = ((Window.getDefaultOrientation() & SWT.RIGHT_TO_LEFT) != 0);
    appModel.getTransientData().put(E4Workbench.RTL_MODE, isRtl);

    // for compatibility layer: set the application in the OSGi service
    // context (see Workbench#getInstance())
    if (!E4Workbench.getServiceContext().containsKey(MApplication.class)) {
      // first one wins.
      E4Workbench.getServiceContext().set(MApplication.class, appModel);
    }

    // Set the app's context after adding itself
    appContext.set(MApplication.class, appModel);

    // adds basic services to the contexts
    initializeServices(appModel);

    // let the life cycle manager add to the model
    if (lcManager != null) {
      ContextInjectionFactory.invoke(lcManager, ProcessAdditions.class, appContext, null);
      ContextInjectionFactory.invoke(lcManager, ProcessRemovals.class, appContext, null);
    }

    // Create the addons
    IEclipseContext addonStaticContext = EclipseContextFactory.create();
    for (MAddon addon : appModel.getAddons()) {
      addonStaticContext.set(MAddon.class, addon);
      Object obj = factory.create(addon.getContributionURI(), appContext, addonStaticContext);
      addon.setObject(obj);
    }

    // Parse out parameters from both the command line and/or the product
    // definition (if any) and put them in the context
    Optional<String> xmiURI = getArgValue(IWorkbench.XMI_URI_ARG, applicationContext, false);
    xmiURI.ifPresent(
        xmiURIValue -> {
          appContext.set(IWorkbench.XMI_URI_ARG, xmiURIValue);
        });

    setCSSContextVariables(applicationContext, appContext);

    Optional<String> rendererFactoryURI =
        getArgValue(E4Workbench.RENDERER_FACTORY_URI, applicationContext, false);
    rendererFactoryURI.ifPresent(
        rendererFactoryURIValue -> {
          appContext.set(E4Workbench.RENDERER_FACTORY_URI, rendererFactoryURIValue);
        });

    // This is a default arg, if missing we use the default rendering engine
    Optional<String> presentationURI =
        getArgValue(IWorkbench.PRESENTATION_URI_ARG, applicationContext, false);
    appContext.set(
        IWorkbench.PRESENTATION_URI_ARG, presentationURI.orElse(PartRenderingEngine.engineURI));

    // Instantiate the Workbench (which is responsible for
    // 'running' the UI (if any)...
    return workbench = new E4Workbench(appModel, appContext);
  }
 @Override
 protected IObservable doCreateObservable() {
   return getObservableContractDelegate()
       .createObservable(DisplayRealm.getRealm(Display.getDefault()));
 }