org.eclipse.emf.eson.scoping.EPackageScopeProvider.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.emf.eson.scoping.EPackageScopeProvider.java

Source

/*
 * #%L
 * org.eclipse.emf.eson
 * %%
 * Copyright (C) 2009 - 2014 Sebastian Benz, Michael Vorburger 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
 * #L%
 */
package org.eclipse.emf.eson.scoping;

import java.util.Collections;
import java.util.List;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.eson.eFactory.Factory;
import org.eclipse.emf.eson.util.EFactoryUtil;
import org.eclipse.emf.eson.util.EPackageResolver;
import org.eclipse.emf.eson.util.EcoreUtil3;
import org.eclipse.xtext.EcoreUtil2;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.scoping.IScope;
import org.eclipse.xtext.scoping.Scopes;
import org.eclipse.xtext.scoping.impl.SimpleScope;

import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.inject.Inject;

public class EPackageScopeProvider implements IEPackageScopeProvider {

    @Inject
    private EFactoryUtil eFactoryUtil;

    @Inject
    private EPackageResolver packageResolver;

    public IScope createEClassScope(Resource resource, EClass type, IScope parent) {
        Iterable<EPackage> ePackages = resolvePackages(resource);
        Iterable<EClass> eClasses = getAllEClasses(ePackages);
        Iterable<EClass> filteredEClasses = filterAssignableEClasses(eClasses, type);
        Iterable<IEObjectDescription> scopedElements = Scopes.scopedElementsFor(filteredEClasses);
        return new SimpleScope(parent, scopedElements);
    }

    private Iterable<EClass> filterAssignableEClasses(Iterable<EClass> eClasses, final EClass targetType) {
        return Iterables.filter(eClasses, new Predicate<EClass>() {

            public boolean apply(EClass input) {
                if (EcoreUtil3.isSubClass(targetType, input) && EcoreUtil3.isInstantiatable(input))
                    return true;
                else
                    return false;
            }
        });
    }

    private Iterable<EPackage> resolvePackages(Resource resource) {
        Factory root = (Factory) resource.getContents().get(0);
        if (root == null) {
            return Collections.emptyList();
        }
        return eFactoryUtil.getEPackages(root);

    }

    public Iterable<EClass> getAllEClasses(Iterable<? extends EPackage> ePackages) {
        return getAllInstances(ePackages, EClass.class);
    }

    private <T extends EObject> Iterable<T> getAllInstances(Iterable<? extends EPackage> ePackages, Class<T> type) {
        Iterable<T> result = Collections.emptyList();
        for (EPackage ePackage : ePackages) {
            List<T> allContents = EcoreUtil2.getAllContentsOfType(ePackage, type);
            result = Iterables.concat(result, allContents);
        }
        return result;
    }

    public IScope createEClassScope(Resource resource, IScope parent) {
        Iterable<EPackage> ePackages = resolvePackages(resource);
        Iterable<EClass> eClasses = getAllEClasses(ePackages);
        Iterable<IEObjectDescription> scopedElements = Scopes.scopedElementsFor(eClasses);
        return new SimpleScope(parent, scopedElements);
    }

    public IScope createEPackageScope(Resource eResource, IScope parent) {
        Iterable<EPackage> ePackages = packageResolver.getAllRegisteredEPackages();
        Iterable<IEObjectDescription> scopedElements = Scopes.scopedElementsFor(ePackages);
        return new SimpleScope(parent, scopedElements);
    }

}