blob: 98e58fbd57f4b5921581a0607f55ae98bc2614a0 [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2015-2016 itemis 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:
* itemis - Initial API and implementation
* itemis - [480105] Occasional ConcurrentModificationException when re-launching Sphinx on previously used workspace
* itemis - [501108] The tree viewer state restoration upon Eclipse startup not working for model elements being added after the loading of the underlying has been finished
*
* </copyright>
*/
package org.eclipse.sphinx.emf.workspace.ui.viewers.state.providers;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.transaction.RunnableWithResult;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.sphinx.emf.model.IModelDescriptor;
import org.eclipse.sphinx.emf.model.ModelDescriptorRegistry;
import org.eclipse.sphinx.emf.resource.ExtendedResource;
import org.eclipse.sphinx.emf.resource.ExtendedResourceAdapterFactory;
import org.eclipse.sphinx.emf.util.EcorePlatformUtil;
import org.eclipse.sphinx.emf.util.EcoreResourceUtil;
import org.eclipse.sphinx.emf.workspace.loading.ModelLoadManager;
import org.eclipse.sphinx.emf.workspace.ui.internal.Activator;
import org.eclipse.sphinx.emf.workspace.util.ModelOperationRunner;
import org.eclipse.sphinx.platform.util.PlatformLogUtil;
import org.eclipse.ui.IMemento;
public class EObjectElementStateProvider extends AbstractTreeElementStateProvider {
private URI uri = null;
private EObject eObject = null;
public EObjectElementStateProvider(TreeViewer viewer, IMemento memento) {
super(viewer);
Assert.isNotNull(memento);
String uriAsString = memento.getString(TreeElementStateProviderFactory.MEMENTO_KEY_URI);
if (uriAsString != null) {
uri = URI.createURI(uriAsString, true);
}
}
public EObjectElementStateProvider(TreeViewer viewer, URI uri) {
super(viewer);
this.uri = uri;
}
@Override
public boolean hasUnderlyingModel() {
return true;
}
@Override
public boolean canUnderlyingModelBeLoaded() {
return EcoreResourceUtil.exists(uri);
}
@Override
public boolean isUnderlyingModelLoaded() {
final Resource resource = EcorePlatformUtil.getResource(uri);
if (resource != null) {
try {
RunnableWithResult<Boolean> runnable = new RunnableWithResult.Impl<Boolean>() {
@Override
public void run() {
ExtendedResource extendedResource = ExtendedResourceAdapterFactory.INSTANCE.adapt(resource);
if (extendedResource != null) {
setResult(extendedResource.isFullyLoaded());
} else {
setResult(true);
}
}
};
ModelOperationRunner.performModelAccess(resource, runnable);
return runnable.getResult();
} catch (CoreException ex) {
PlatformLogUtil.logAsError(Activator.getPlugin(), ex);
return false;
}
}
return false;
}
@Override
public void loadUnderlyingModel() {
IFile file = EcorePlatformUtil.getFile(uri);
IModelDescriptor modelDescriptor = ModelDescriptorRegistry.INSTANCE.getModel(file);
if (modelDescriptor != null) {
// Request asynchronous loading of model behind given model object
ModelLoadManager.INSTANCE.loadModel(modelDescriptor, true, null);
}
}
@Override
public boolean isStale() {
return getTreeElement() == null;
}
@Override
public Object getTreeElement() {
if (eObject == null) {
eObject = EcorePlatformUtil.getEObject(uri);
}
return eObject;
}
@Override
public void appendToMemento(IMemento parentMemento) {
if (uri != null) {
IMemento memento = parentMemento.createChild(TreeElementStateProviderFactory.MEMENTO_TYPE_ELEMENT_EOBJECT);
memento.putString(TreeElementStateProviderFactory.MEMENTO_KEY_URI, uri.toString());
}
}
@Override
public String toString() {
return "EObjectElementProvider [uri=" + uri + ", eObject=" + eObject + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}