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

fr.centralesupelec.edf.riseclipse.util.AbstractRiseClipseResourceSet Maven / Gradle / Ivy

/*
*************************************************************************
**  Copyright (c) 2016-2022 CentraleSupélec & EDF.
**  All rights reserved. This program and the accompanying materials
**  are made available under the terms of the Eclipse Public License v2.0
**  which accompanies this distribution, and is available at
**  https://www.eclipse.org/legal/epl-v20.html
** 
**  This file is part of the RiseClipse tool
**  
**  Contributors:
**      Computer Science Department, CentraleSupélec
**      EDF R&D
**  Contacts:
**      [email protected]
**      [email protected]
**  Web site:
**      https://riseclipse.github.io
*************************************************************************
*/
package fr.centralesupelec.edf.riseclipse.util;

import java.util.Optional;

import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.jdt.annotation.NonNull;

/**
 * Minimal implementation of ResourceSet for RiseClipse conforming metamodels.
 * It checks that only IRiseClipseResource are used, and give access to
 * contained resources as IRiseClipseResource
 *  
 * @author Dominique Marcadet
 *
 */
public abstract class AbstractRiseClipseResourceSet extends ResourceSetImpl implements IRiseClipseResourceSet {

    // If true, only IRiseClipseResource can be added
    protected boolean strictContent;
    
    // When the resourceSet will load several resources at once, it is
    // useless to call finalizeLoad() after each one. Indeed, such a call
    // can lead to wrong error messages.
    // As the resourceSet do not know when the last resource is loaded,
    // it is the client that must call finalizeLoad() in this case.
    //
    // When a resource is added to an existing resourceSet, the client
    // may not have an easy way to call finalizeLoad() after (the "load
    // resource" command in RiseClipse editor use directly the editing
    // domain). If set, this boolean will then call finalizeLoad() after
    // a getResource().
    private boolean callFinalizeLoadAfterGetResource;

    protected AbstractRiseClipseResourceSet( boolean strictContent ) {
        this.strictContent = strictContent;
        this.callFinalizeLoadAfterGetResource = false;
    }
    
    public void setCallFinalizeLoadAfterGetResource() {
        callFinalizeLoadAfterGetResource = true;
    }

    @Override
    public void printStatistics( @NonNull IRiseClipseConsole console ) {
        getRiseClipseResources().stream().forEach( r -> r.printStatistics( console ) );
    }

    @Override
    public void finalizeLoad( @NonNull IRiseClipseConsole console ) {
        getRiseClipseResources().stream().forEach( r -> r.finalizeLoad( console ) );
    }

    public @NonNull EList< IRiseClipseResource > getRiseClipseResources() {
        // The list is copied, but it is expected that the number of resources is low,
        // so this should not be a problem.
        EList< IRiseClipseResource > res = new BasicEList<>();
        for( Resource r : super.getResources() ) {
           if( r instanceof IRiseClipseResource ) {
               res.add(( IRiseClipseResource ) r );
           }
       }
        
        return res;
    }

    /* (non-Javadoc)
     * @see org.eclipse.emf.ecore.resource.impl.ResourceSetImpl#getResource(org.eclipse.emf.common.util.URI, boolean)
     */
    @Override
    public @NonNull Resource getResource( @NonNull URI uri, boolean loadOnDemand ) {
        Resource res = super.getResource( uri, loadOnDemand );
        
        if( callFinalizeLoadAfterGetResource && ( res instanceof IRiseClipseResource )) {
            finalizeLoad( AbstractRiseClipseConsole.getConsole() );
        }
        return res;
    }

    /* (non-Javadoc)
     * @see org.eclipse.emf.ecore.resource.impl.ResourceSetImpl#createResource(org.eclipse.emf.common.util.URI, java.lang.String)
     */
    @Override
    public Resource createResource( @NonNull URI uri, @NonNull String contentType ) {
        Resource res = null;
        Optional< String > metamodelName = RiseClipseMetamodel.findMetamodelFor( uri );
        if( metamodelName.isPresent() ) {
            res = createRiseClipseResource( uri, contentType );
        }
        if(( res == null ) && ! strictContent ) {
            res = super.createResource( uri, contentType );
        }
        if( res != null ) {
            getResources().add( res );
        }
        return res;
    }

    protected abstract @NonNull IRiseClipseResource createRiseClipseResource( @NonNull URI uri, @NonNull String contentType );

}






© 2015 - 2025 Weber Informatics LLC | Privacy Policy