All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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