/**
* Copyright (c) 2015 committers of YAKINDU 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:
* committers of YAKINDU - initial API and implementation
*
*/
package org.yakindu.base.xtext.utils.jface.viewers.context;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.xtext.Constants;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.ui.resource.IResourceSetProvider;
import org.eclipse.xtext.util.StringInputStream;
import org.yakindu.base.xtext.utils.jface.viewers.util.ActiveEditorTracker;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.name.Named;
/**
* Context used by {@link XtextStyledTextAdapter} to handle the required
* underlying (fake) resources.
*
* @author alexander.nyssen@itemis.de
*
*/
public class XtextFakeResourceContext {
@Inject
private IResourceSetProvider resourceSetProvider;
private ResourceSet fakeResourceSet;
@Inject
private XtextResource fakeResource;
@Inject
private @Named(Constants.FILE_EXTENSIONS)
String fakeResourceFileExtension;
public XtextFakeResourceContext(Injector injector) {
injector.injectMembers(this);
// create resource set
createXtextFakeResourceSet();
// initialize fake resource (which was injected and thus does not has to
// be created)
initXtextFakeResource();
// initialize the resource set (the fake resource has to be added)
initXtextFakeResourceSet();
}
protected void initXtextFakeResourceSet() {
fakeResourceSet.getResources().add(fakeResource);
// fakeResourceSet.getLoadOptions().put(
// ResourceDescriptionsProvider.LIVE_SCOPE, Boolean.TRUE);
}
protected ResourceSet getFakeResourceSet() {
return fakeResourceSet;
}
protected void createXtextFakeResourceSet() {
fakeResourceSet = resourceSetProvider.get(getActiveProject());
}
protected void initXtextFakeResource() {
// add the fake resource (add an uri to it, first)
IProject activeProject = getActiveProject();
// fallback to avoid dependency on open editor
String activeProjectName = activeProject != null ? activeProject
.getName() : "fakeResource";
fakeResource.setURI(createFakeResourceUri(activeProjectName));
try {
fakeResource.load(new StringInputStream(""), Collections.EMPTY_MAP);
} catch (IOException e) {
e.printStackTrace();
}
}
public XtextResource getFakeResource() {
return fakeResource;
}
private URI createFakeResourceBaseFragment(String activeProject) {
return URI.createPlatformResourceURI(activeProject + "/embedded", true);
}
private URI createFakeResourceUri(String activeProject) {
return createFakeResourceBaseFragment(activeProject)
.appendFileExtension(fakeResourceFileExtension);
}
protected String getFileExtension() {
return fakeResourceFileExtension;
}
protected IProject getActiveProject() {
return ActiveEditorTracker.getLastActiveEditorProject();
}
public void updateFakeResourceContext(
IXtextFakeContextResourcesProvider contextProvider) {
// remove any other resources that may have been created earlier
// unloading them (to remove all adapters)
List<Resource> staleResources = new ArrayList<Resource>();
for (Resource r : fakeResourceSet.getResources()) {
if (r != fakeResource) {
staleResources.add(r);
r.unload();
}
}
fakeResourceSet.getResources().removeAll(staleResources);
// when populating the fake resource set, the non-existing fake resource
// contained in the resource set may be problematic, so we temporarily
// remove it
fakeResourceSet.getResources().remove(fakeResource);
contextProvider.populateFakeResourceSet(fakeResourceSet, fakeResource);
fakeResourceSet.getResources().add(fakeResource);
}
}