eu.numberfour.n4js.ui.building.ResourceDescriptionWithoutModuleUserData.java Source code

Java tutorial

Introduction

Here is the source code for eu.numberfour.n4js.ui.building.ResourceDescriptionWithoutModuleUserData.java

Source

/**
 * Copyright (c) 2016 NumberFour AG.
 * 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:
 *   NumberFour AG - Initial API and implementation
 */
package eu.numberfour.n4js.ui.building;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.resource.IReferenceDescription;
import org.eclipse.xtext.resource.IResourceDescription;

import com.google.common.collect.Iterables;

import eu.numberfour.n4js.resource.UserdataMapper;
import eu.numberfour.n4js.ts.types.TypesPackage;

/**
 * Wraps an existing {@link IResourceDescription} in order to hide the serialized TModule in the user data (see
 * {@link UserdataMapper}).
 * <p>
 * This is used by the incremental builder to enforce a fully re-load of certain resources for which the TModule info in
 * the user data is out-dated. See method <code>#queueAffectedResources()</code> in
 * {@link N4JSGenerateImmediatelyBuilderState} for details.
 */
public class ResourceDescriptionWithoutModuleUserData implements IResourceDescription {

    private final IResourceDescription delegate;

    /**
     * Create instance.
     */
    public ResourceDescriptionWithoutModuleUserData(IResourceDescription delegate) {
        this.delegate = delegate;
    }

    @Override
    public URI getURI() {
        return delegate.getURI();
    }

    @Override
    public boolean isEmpty() {
        return delegate.isEmpty();
    }

    @Override
    public Iterable<IEObjectDescription> getExportedObjects(EClass type, QualifiedName name, boolean ignoreCase) {
        return Iterables.transform(delegate.getExportedObjects(type, name, ignoreCase), this::wrapIfModule);
    }

    @Override
    public Iterable<IEObjectDescription> getExportedObjectsByType(EClass type) {
        return Iterables.transform(delegate.getExportedObjectsByType(type), this::wrapIfModule);
    }

    @Override
    public Iterable<IEObjectDescription> getExportedObjectsByObject(EObject object) {
        return Iterables.transform(delegate.getExportedObjectsByObject(object), this::wrapIfModule);
    }

    @Override
    public Iterable<IEObjectDescription> getExportedObjects() {
        return Iterables.transform(delegate.getExportedObjects(), this::wrapIfModule);
    }

    @Override
    public Iterable<QualifiedName> getImportedNames() {
        return delegate.getImportedNames();
    }

    @Override
    public Iterable<IReferenceDescription> getReferenceDescriptions() {
        return delegate.getReferenceDescriptions();
    }

    /**
     * (non-API)
     *
     * Returns with the delegate resource description which is actually an instance of {@code ReferenceDescriptionImpl},
     * hence {@link EObject}. Used by the persister at graceful application shutdown.
     *
     * @return the delegate resource description.
     */
    public IResourceDescription getDelegate() {
        return delegate;
    }

    private IEObjectDescription wrapIfModule(IEObjectDescription desc) {
        if (desc.getEClass() == TypesPackage.eINSTANCE.getTModule())
            return new EObjectDescriptionWithoutModuleUserData(desc);
        return desc;
    }

    private static final class EObjectDescriptionWithoutModuleUserData implements IEObjectDescription {

        private final IEObjectDescription delegate;

        public EObjectDescriptionWithoutModuleUserData(IEObjectDescription delegate) {
            this.delegate = delegate;
        }

        @Override
        public QualifiedName getName() {
            return delegate.getName();
        }

        @Override
        public QualifiedName getQualifiedName() {
            return delegate.getQualifiedName();
        }

        @Override
        public EObject getEObjectOrProxy() {
            return delegate.getEObjectOrProxy();
        }

        @Override
        public URI getEObjectURI() {
            return delegate.getEObjectURI();
        }

        @Override
        public EClass getEClass() {
            return delegate.getEClass();
        }

        @Override
        public String getUserData(String key) {
            if (UserdataMapper.USERDATA_KEY_SERIALIZED_SCRIPT.equals(key))
                return null;
            return delegate.getUserData(key);
        }

        @Override
        public String[] getUserDataKeys() {
            // no need to remove UserdataMapper#USERDATA_KEY_SERIALIZED_SCRIPT here, UserdataMapper can deal with the
            // situation that the key exists but the value is null
            return delegate.getUserDataKeys();
        }
    }
}