/******************************************************************************* * Copyright (c) 2010, 2015 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation ******************************************************************************/ package org.eclipse.e4.ui.tests.application; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import javax.inject.Inject; import javax.inject.Named; import org.eclipse.e4.core.contexts.ContextFunction; import org.eclipse.e4.core.contexts.ContextInjectionFactory; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.core.di.annotations.Optional; import org.eclipse.e4.core.services.contributions.IContributionFactory; import org.eclipse.e4.ui.internal.workbench.UIEventPublisher; import org.eclipse.e4.ui.internal.workbench.swt.E4Application; import org.eclipse.e4.ui.model.application.MApplication; import org.eclipse.e4.ui.model.application.ui.basic.MPart; import org.eclipse.e4.ui.model.application.ui.basic.MWindow; import org.eclipse.e4.ui.services.IServiceConstants; import org.eclipse.e4.ui.workbench.IPresentationEngine; import org.eclipse.e4.ui.workbench.modeling.EModelService; import org.eclipse.emf.common.notify.Notifier; import org.junit.After; import org.junit.Before; import org.junit.Test; public class Bug320857Test { private IEclipseContext applicationContext; private IPresentationEngine engine; private EModelService ems; @Before public void setUp() throws Exception { applicationContext = E4Application.createDefaultContext(); ems = applicationContext.get(EModelService.class); } protected String getEngineURI() { return "bundleclass://org.eclipse.e4.ui.tests/org.eclipse.e4.ui.tests.application.HeadlessContextPresentationEngine"; //$NON-NLS-1$ } @After public void tearDown() throws Exception { applicationContext.dispose(); } private void initialize(IEclipseContext applicationContext, MApplication application) { applicationContext.set(MApplication.class, application); application.setContext(applicationContext); final UIEventPublisher ep = new UIEventPublisher(applicationContext); ((Notifier) application).eAdapters().add(ep); applicationContext.set(UIEventPublisher.class, ep); } private IPresentationEngine getEngine() { if (engine == null) { IContributionFactory contributionFactory = applicationContext.get(IContributionFactory.class); Object newEngine = contributionFactory.create(getEngineURI(), applicationContext); assertTrue(newEngine instanceof IPresentationEngine); applicationContext.set(IPresentationEngine.class.getName(), newEngine); engine = (IPresentationEngine) newEngine; } return engine; } public static class Bug320857 { static final String OUT_SELECTION = "output.selection"; //$NON-NLS-1$ @Inject private IEclipseContext context; @Inject void setPart( @Optional @Named(IServiceConstants.ACTIVE_PART) final MPart part) { if (part != null) { IEclipseContext partContext = part.getContext(); partContext.containsKey(OUT_SELECTION); } } public void setSelection(Object selection) { context.set(OUT_SELECTION, selection); } } @Test public void testBug320857() throws Exception { MApplication application = ems.createModelElement(MApplication.class); MWindow window = ems.createModelElement(MWindow.class); application.getChildren().add(window); application.setSelectedElement(window); MPart part = ems.createModelElement(MPart.class); window.getChildren().add(part); window.setSelectedElement(part); initialize(applicationContext, application); getEngine().createGui(window); applicationContext.set(Bug320857.class.getName(), new ContextFunction() { @Override public Object compute(IEclipseContext context, String contextKey) { return ContextInjectionFactory.make(Bug320857.class, context); } }); IEclipseContext partContext = part.getContext(); Bug320857 selectionServiceA = partContext.get(Bug320857.class); selectionServiceA.setSelection(new Object()); Bug320857 selectionServiceB = partContext.get(Bug320857.class); assertEquals(selectionServiceA, selectionServiceB); assertSame(selectionServiceA, selectionServiceB); } }