
org.eclipse.xtext.resource.containers.StateBasedContainerManager Maven / Gradle / Ivy
/*******************************************************************************
* Copyright (c) 2009 itemis AG (http://www.itemis.eu) 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
*******************************************************************************/
package org.eclipse.xtext.resource.containers;
import java.util.Collections;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.xtext.resource.IContainer;
import org.eclipse.xtext.resource.IResourceDescription;
import org.eclipse.xtext.resource.IResourceDescriptions;
import com.google.common.collect.Lists;
import com.google.inject.Inject;
/**
* @author Sebastian Zarnekow - Initial contribution and API
* @author Sven Efftinge
*/
public class StateBasedContainerManager implements IContainer.Manager {
private final static Logger log = Logger.getLogger(StateBasedContainerManager.class);
@Inject
private IAllContainersState.Provider stateProvider;
public IContainer getContainer(IResourceDescription desc, IResourceDescriptions resourceDescriptions) {
String root = internalGetContainerHandle(desc, resourceDescriptions);
if (root == null) {
if (log.isDebugEnabled())
log.debug("Cannot find IContainer for: " + desc.getURI());
return IContainer.NULL_CONTAINER;
}
IContainer result = createContainer(root, resourceDescriptions);
if (!result.hasResourceDescription(desc.getURI())) {
// desc has not been saved -> merge containers
result = new DescriptionAddingContainer(desc, result);
}
return result;
}
public List getVisibleContainers(IResourceDescription desc, IResourceDescriptions resourceDescriptions) {
String root = internalGetContainerHandle(desc, resourceDescriptions);
if (root == null) {
if (log.isDebugEnabled())
log.debug("Cannot find IContainer for: " + desc.getURI());
return Collections.emptyList();
}
List handles = getState(resourceDescriptions).getVisibleContainerHandles(root);
List result = getVisibleContainers(handles, resourceDescriptions);
if (!result.isEmpty()) {
IContainer first = result.get(0);
if (!first.hasResourceDescription(desc.getURI())) {
first = new DescriptionAddingContainer(desc, first);
result.set(0, first);
}
}
return result;
}
/**
* @since 2.3
*/
protected IAllContainersState getState(IResourceDescriptions resourceDescriptions) {
return stateProvider.get(resourceDescriptions);
}
protected IContainer createContainer(String handle, IResourceDescriptions resourceDescriptions) {
IAllContainersState state = getState(resourceDescriptions);
IContainerState containerState = new ContainerState(handle, state);
StateBasedContainer result = new StateBasedContainer(resourceDescriptions, containerState);
if (state instanceof FlatResourceSetBasedAllContainersState)
result.setUriToDescriptionCacheEnabled(false);
return result;
}
protected List getVisibleContainers(List handles, IResourceDescriptions resourceDescriptions) {
if (handles.isEmpty())
return Collections.emptyList();
List result = Lists.newArrayListWithExpectedSize(handles.size());
for(String handle: handles) {
IContainer container = createContainer(handle, resourceDescriptions);
if (!container.isEmpty() || result.isEmpty())
result.add(container);
}
return result;
}
protected String internalGetContainerHandle(IResourceDescription desc, IResourceDescriptions resourceDescriptions) {
return getState(resourceDescriptions).getContainerHandle(desc.getURI());
}
public IAllContainersState.Provider getStateProvider() {
return stateProvider;
}
public void setStateProvider(IAllContainersState.Provider stateProvider) {
this.stateProvider = stateProvider;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy