/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.core; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.isA; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.Iterator; import java.util.List; import org.eclipse.emf.common.command.BasicCommandStack; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.edit.provider.ChangeNotifier; import org.eclipse.emf.edit.provider.ComposedAdapterFactory; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.teiid.core.designer.EclipseMock; import org.teiid.core.designer.util.CoreArgCheck; import org.teiid.designer.core.container.Container; import org.teiid.designer.core.container.ContainerEditingDomain; import org.teiid.designer.core.container.DefaultEObjectFinder; import org.teiid.designer.core.container.DefaultResourceFinder; import org.teiid.designer.core.container.ObjectManagerImpl; import org.teiid.designer.core.container.ResourceDescriptor; import org.teiid.designer.core.container.ResourceDescriptorImpl; import org.teiid.designer.core.container.ResourceFinder; import org.teiid.designer.core.metamodel.MetamodelRegistry; import org.teiid.designer.core.resource.EmfResourceSetImpl; import org.teiid.designer.core.spi.RegistrySPI; import org.teiid.designer.core.transaction.UnitOfWorkProviderImpl; import org.teiid.designer.core.types.DatatypeManager; import org.teiid.designer.core.types.DatatypeManagerLifecycle; /** * */ @SuppressWarnings( "javadoc" ) public final class ModelWorkspaceMock { private final EclipseMock eclipseMock; private Container container; private EditingDomain editingDomain; private ModelEditorMock editorMock; /** * Mocks core modeling classes used when running Designer. */ public ModelWorkspaceMock() throws Exception { this(new EclipseMock()); } /** * Mocks core modelling classes used when running Designer. */ public ModelWorkspaceMock(final EclipseMock mock) throws Exception { CoreArgCheck.isNotNull(mock, "mock"); //$NON-NLS-1$ eclipseMock = mock; // // Mock the container // container = mock(Container.class); ((RegistrySPI)ModelerCore.getRegistry()).register(ModelerCore.DEFAULT_CONTAINER_KEY, container); // // Initialise the internal resource set // final EmfResourceSetImpl resourceSet = new EmfResourceSetImpl(container); when(container.getResources()).thenReturn(resourceSet.getResources()); when(container.getResource(isA(URI.class), anyBoolean())).thenAnswer(new Answer<Resource>() { @Override public Resource answer(InvocationOnMock invocation) throws Throwable { Object[] args = invocation.getArguments(); return resourceSet.getResource((URI)args[0], (Boolean)args[1]); } }); when(container.createResource(isA(URI.class))).thenAnswer(new Answer<Resource>() { @Override public Resource answer(InvocationOnMock invocation) throws Throwable { Object[] args = invocation.getArguments(); return resourceSet.createResource((URI)args[0]); } }); // // Resource Finder // DefaultResourceFinder resourceFinder = new DefaultResourceFinder(container); when(container.getResourceFinder()).thenReturn(resourceFinder); // // EObject Finder // DefaultEObjectFinder eObjectFinder = new DefaultEObjectFinder(container); when(container.getEObjectFinder()).thenReturn(eObjectFinder); ObjectManagerImpl objectManager = new ObjectManagerImpl(container); when(container.getObjectManager()).thenReturn(objectManager); // // Add external resource sets // List<ResourceSet> extResourceSets = ModelerCore.getExternalResourceSets(); for (ResourceSet rsrcSet : extResourceSets) { resourceSet.addExternalResourceSet(rsrcSet); } // // Initialise the transaction provider // UnitOfWorkProviderImpl emfTransactionProvider = new UnitOfWorkProviderImpl(resourceSet); when(container.getEmfTransactionProvider()).thenReturn(emfTransactionProvider); // // Set the metamodel registry // MetamodelRegistry registry = ModelerCore.getMetamodelRegistry(); when(container.getMetamodelRegistry()).thenReturn(registry); // // Mock the change notifier // ChangeNotifier changeNotifier = new ChangeNotifier(); when(container.getChangeNotifier()).thenReturn(changeNotifier); // // Initialise the data type manager // DatatypeManager datatypeManager = ModelerCore.getDatatypeManager(); when(container.getDatatypeManager()).thenReturn(datatypeManager); ((DatatypeManagerLifecycle)datatypeManager).initialize(container); // Register the known resource descriptors final Iterator iter = ModelerCore.getConfiguration().getResourceDescriptors().iterator(); while (iter.hasNext()) { final ResourceDescriptor resourceDescriptor = (ResourceDescriptor)iter.next(); ResourceDescriptorImpl.register(resourceDescriptor, resourceSet); } // // ModelEditor // editorMock = new ModelEditorMock(this); } /** * Dispose this {@link ModelWorkspaceMock}. * * This is necessary to remove the mocked objects from the * {@link ModelerCore} registry that have been registered by this instance. */ public void dispose() throws Exception { ((RegistrySPI)ModelerCore.getRegistry()).unregister(ModelerCore.DEFAULT_CONTAINER_KEY); ((RegistrySPI)ModelerCore.getRegistry()).unregister(ModelerCore.MODEL_EDITOR_KEY); Mockito.reset(container); container = null; editingDomain = null; editorMock.dispose(); eclipseMock.dispose(); } /** * @return eclipseMock */ public EclipseMock getEclipseMock() { return eclipseMock; } /** * @return the editor */ public ModelEditor getModelEditor() { return editorMock.getModelEditor(); } /** * @return the container */ public Container getContainer() { return this.container; } /** * @return finder */ public ResourceFinder getFinder() { return container.getResourceFinder(); } public void setFinder(ResourceFinder finder) { when(container.getResourceFinder()).thenReturn(finder); } /** * @return editing domain */ public EditingDomain getEditingDomain() { if (editingDomain == null) { // Retrieve the adapter factory that yields item providers. final ComposedAdapterFactory adapterFactory = (ComposedAdapterFactory)ModelerCore.getMetamodelRegistry().getAdapterFactory(); CoreArgCheck.isNotNull(container.getEmfTransactionProvider()); // Create the command stack final BasicCommandStack commandStack = new BasicCommandStack(); // Create the editing domain editingDomain = new ContainerEditingDomain(adapterFactory, commandStack, container); } return editingDomain; } }