/**
 *                                                                            
 * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0 
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *         Florian Pirchner - Initial implementation
 *   
 *  This copyright notice shows up in the generated Java code
 *
 */
 
package org.eclipse.osbp.xtext.oxtype.scoping.jvmtype

import com.google.common.base.Predicate
import com.google.common.collect.Iterables
import org.eclipse.emf.ecore.EObject
import org.eclipse.xtext.common.types.TypesPackage
import org.eclipse.xtext.common.types.access.IJvmTypeProvider
import org.eclipse.xtext.common.types.xtext.AbstractTypeScope
import org.eclipse.xtext.naming.IQualifiedNameConverter
import org.eclipse.xtext.naming.QualifiedName
import org.eclipse.xtext.resource.IEObjectDescription
import org.eclipse.xtext.resource.IResourceDescription
import org.eclipse.xtext.scoping.IScope

class LocalResourceFilteringTypeScope extends AbstractTypeScope {

	private AbstractTypeScope delegate;
	private IResourceDescription filterDescription;

	new(AbstractTypeScope delegate, IResourceDescription filterDescription) {
		super(null, null, null);
		this.delegate = delegate;
		this.filterDescription = filterDescription;
	}

	override IEObjectDescription getSingleElement(QualifiedName name) {
		if (isFiltered(name)) {
			return null;
		}
		return delegate.getSingleElement(name);
	}

	def boolean isFiltered(QualifiedName name) {
		val Iterable<IEObjectDescription> exportedObjects = filterDescription.getExportedObjects(
			TypesPackage.Literals.JVM_TYPE, name, false);
		return !Iterables.isEmpty(exportedObjects);
	}

	override IEObjectDescription getSingleElement(QualifiedName name, boolean binary) {
		if (isFiltered(name)) {
			return null;
		}
		return delegate.getSingleElement(name, binary);
	}

	override Iterable<IEObjectDescription> getElements(QualifiedName name) {
		return Iterables.filter(delegate.getElements(name),
			new Predicate<IEObjectDescription>() {
				override boolean apply(IEObjectDescription input) {
					return !isFiltered(input.getQualifiedName());
				}
			});
	}

	override Iterable<IEObjectDescription> getElements(EObject object) {
		return Iterables.filter(delegate.getElements(object),
			new Predicate<IEObjectDescription>() {
				override boolean apply(IEObjectDescription input) {
					return !isFiltered(input.getQualifiedName());
				}
			});
	}

	override IScope getParent() {
		return delegate.getParent();
	}

	override Iterable<IEObjectDescription> getAllElements() {
		return Iterables.filter(delegate.getAllElements(),
			new Predicate<IEObjectDescription>() {
				override boolean apply(IEObjectDescription input) {
					return !isFiltered(input.getQualifiedName());
				}
			});
	}

	override IJvmTypeProvider getTypeProvider() {
		return delegate.getTypeProvider();
	}

	override IQualifiedNameConverter getQualifiedNameConverter() {
		return delegate.getQualifiedNameConverter();
	}

	override IEObjectDescription getSingleElement(EObject object) {
		return delegate.getSingleElement(object);
	}

}
