blob: 0aa7bf922a6fcfe39126b99f153d7e532083b0ea [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2019 Willink Transformations and others.
* 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
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* E.D.Willink - initial API and implementation
*
* The standalone functionality is heavily influenced by org.eclipse.emf.mwe.utils.StandaloneSetup.
*******************************************************************************/
package org.eclipse.ocl.pivot.resource;
import java.io.File;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
/**
* Clients might use one of the following implementations
* <ul>
* <li>{@link ProjectManager#NO_PROJECTS} - Lightweight with no external projects contributions</li>
* <li>{@link ProjectManager#CLASS_PATH} - A shared Heavyweight including classpath analysis</li>
* <li>{@link BasicProjectManager#createDefaultProjectManager()} - Convenient method to create local heavyweight local managers</li>
* </ul>
* @noimplement This interface is not intended to be implemented by clients.
*/
public interface ProjectManager extends Adapter
{
/**
* The NO_PROJECTS instance of ProjectManager contributes no external projects to a user application.
*/
public static final @NonNull ProjectManager NO_PROJECTS = new BasicProjectManager(); // FIXME Use static method to make this lazy
/**
* The CLASS_PATH ProjectManager provides a shared ProjectManager that allows many OCL instances to share
* a single immutable ProjectManager and consequently share the costly classpath analysis to identify
* available projects.
*/
public static final @NonNull ProjectManager CLASS_PATH = BasicProjectManager.createGlobalProjectManager(); // FIXME Use static method to make this lazy
/**
* An IConflictHandler configures the handling of conflicting access between generated packages and
* dynamically loaded resources.
*/
public static interface IConflictHandler
{
/**
* Return the EPackage to be used for a namespace URI reference after the model EPackage has already been used.
*/
@Nullable EPackage handleConflictingGeneratedPackage(@NonNull IPackageLoadStatus packageLoadStatus, @NonNull Resource resource);
/**
* Return the EPackage to be used for a model URI reference after the namespace EPackage has already been used.
*/
@Nullable EPackage handleConflictingDynamicResource(@NonNull IResourceLoadStatus packageLoadStatus, @NonNull EPackage ePackage);
}
/**
* An IPackageDescriptor describes the modeling capabilities of a known
* model package and may be installed under a variety of synonyms in an
* EPackage.Registry to map multiple URIs to a single EPackage.
*/
public static interface IPackageDescriptor
{
/**
* Configure the resourceSet-specific resource status of for this package to use
* a strategy and a conflictHandler.
*/
void configure(@NonNull ResourceSet resourceSet, @NonNull IResourceLoadStrategy strategy, @Nullable IConflictHandler conflictHandler);
/**
* Return the classname defined in the generated_packaged extension point, or null if undefined.
*/
@Nullable String getClassName();
/**
* Return the Package Namespace URI.
*/
@NonNull URI getNsURI();
/**
* Return the IResourceDescriptor containing this package.
*/
@NonNull IResourceDescriptor getResourceDescriptor();
}
/**
* An IPackageLoadStatus maintains the lazy load state of a package within an EPackage.Registry
*/
public static interface IPackageLoadStatus
{
/**
* Configure the resourceSet EPackage.Registry for this package to resolve to the defined
* generated/loaded EPackage.
*/
void configureEPackageRegistry(@NonNull ResourceSet resourceSet);
/**
* Dispose of all facilities used by the PackageLoadStatus, and remove all EPackageDescriptor entries.
*/
void dispose();
/**
* Return the EPackage to be used for a namespace URI after a platform-resource/plugin URI has already been loaded.
*/
@Nullable EPackage getConflictingGeneratedPackage();
/**
* Return the generated EPackage instance, or null if none loaded.
*/
@Nullable EPackage getEPackage();
/**
* Return the generated EPackage instance without affecting the prevailing status.
* Returns null if an instance cannot be loaded.
*/
@Nullable EPackage getEPackageInstance();
/**
* Return the EPackage resolved by the first loadEPackageByModelURI/loadEPackageByNsURI, or null if none loaded.
*/
@Nullable EPackage getFirstEPackage();
/**
* Return the loaded EPackages, or null if none loaded.
*/
@Nullable EPackage getModel();
/**
* Return the descriptor for the package.
*/
@NonNull IPackageDescriptor getPackageDescriptor();
/**
* Get the status of the resource containing this package.
*/
@NonNull IResourceLoadStatus getResourceLoadStatus();
/**
* Load and return the generated EPackage instance appropriate to the namespace URI.
*/
@Nullable EPackage loadEPackage();
/**
* Define the generated EPackage for this package.
*/
void setEPackage(@NonNull EPackage ePackage);
/**
* Define the loaded EPackage for this package.
*/
void setModel(@NonNull EPackage ePackage);
/**
* Reset the status following notiofication that the model has been unloaded.
*/
void unloadedResource();
}
/**
* An IProjectDescriptor describes the capabilities of a project.
*/
public static interface IProjectDescriptor
{
/**
* @since 1.1
*/
public static interface IProjectDescriptorExtension extends IProjectDescriptor
{
/**
* Return all the package descriptors for this project.
*/
@Nullable Iterable<@NonNull IPackageDescriptor> getPackageDescriptors();
}
/**
* Call back to add a packageDescriptor to the project.
*/
void addPackageDescriptor(@NonNull IPackageDescriptor packageDescriptor);
/**
* Call back to add a resourceDescriptor to the project.
*/
void addResourceDescriptor(@NonNull IResourceDescriptor resourceDescriptor);
/**
* Configure the resourceSet-specific status of for this resource to use
* a strategy and a conflictHandler.
*/
void configure(@Nullable ResourceSet resourceSet, @NonNull IResourceLoadStrategy resourceLoadStrategy, @Nullable IConflictHandler conflictHandler);
/**
* Create an IResourceDescriptor for a projectRelativeGenModelUri comprsising a map of NsURI to className.
*/
@NonNull IResourceDescriptor createResourceDescriptor(@NonNull String projectRelativeGenModelUri, @NonNull Map<@NonNull URI, @NonNull String> nsURI2className);
/**
* Return the physical location of this project.
*/
@NonNull URI getLocationURI();
/**
* Return the physical location of a projectRelativeFileName as a URI.
*/
@NonNull URI getLocationURI(@NonNull String projectRelativeFileName);
/**
* Return the physical location of a projectRelativeFileName as a File.
*/
@NonNull File getLocationFile(@NonNull String projectRelativeFileName);
/**
* Return project name.
*/
@NonNull String getName();
/**
* Return the location of this project as a platform:/plugin URI.
*/
@NonNull URI getPlatformPluginURI();
/**
* Return the location of a projectRelativeFileName as a
* platform:/resource URI.
*/
@NonNull URI getPlatformPluginURI(@NonNull String projectRelativeFileName);
/**
* Return the location of this project as a platform:/resource URI.
*/
@NonNull URI getPlatformResourceURI();
/**
* Return the location of a projectRelativeFileName as a
* platform:/resource URI.
*/
@NonNull URI getPlatformResourceURI(@NonNull String projectRelativeFileName);
/**
* Return the package descriptor for the package with a given nsURI or
* null if none known in the project.
*/
@Nullable IPackageDescriptor getPackageDescriptor(@NonNull URI nsURI);
/**
* Return the overall ProjectMap.
*/
@NonNull ProjectManager getProjectManager();
/**
* Return all packages descriptors in the project.
*/
@Nullable Collection<@NonNull IResourceDescriptor> getResourceDescriptors();
void initializeGenModelLocationMap(@NonNull Map<@NonNull URI, @NonNull IPackageDescriptor> nsURI2package);
void initializePlatformResourceMap();
void initializeURIMap(@NonNull Map<URI, URI> uriMap);
void unload(@NonNull ResourceSet resourceSet);
}
/**
* An IResourceDescriptor describes the modeling capabilities of one or more known
* model packages in a genmodel.
*/
public static interface IResourceDescriptor
{
void addedDynamicResource(@NonNull ResourceSet resourceSet, @NonNull Resource resource);
void addedGeneratedPackage(@NonNull ResourceSet resourceSet, @NonNull EPackage ePackage);
void configure(@Nullable ResourceSet resourceSet, @NonNull IResourceLoadStrategy resourceLoadStrategy, @Nullable IConflictHandler conflictHandler);
void configureResourceSetURIResourceMap(@NonNull ResourceSet resourceSet, @NonNull Resource resource);
/**
* Return the project relative Gen Model URI.
*/
@NonNull URI getGenModelURI();
/**
* Return the external filespace form of the model URI containing the package.
* @throws IllegalStateException if there is no Ecore model.
*/
@NonNull URI getLocationURI();
/**
* Return the descriptors for allpackages in this resource.
*/
Iterable<@NonNull ? extends IPackageDescriptor> getPackageDescriptors();
/**
* Return the platform:/resource form of the model URI containing the package
* @throws IllegalStateException if there is no Ecore model.
*/
@NonNull URI getPlatformResourceURI();
/**
* Return the platform:/plugin form of the model URI containing the package
* @throws IllegalStateException if there is no Ecore model.
*/
@NonNull URI getPlatformPluginURI();
/**
* Return the Project Descriptor containing this resource.
*/
@NonNull IProjectDescriptor getProjectDescriptor();
@NonNull URI getProjectRelativeEcorePackageURI(@NonNull URI genModelRelativeEcorePackageURI);
/**
* Return IResourceLoadStatus for this resource in conjunction with resourceSet.
*/
@NonNull IResourceLoadStatus getResourceLoadStatus(@Nullable ResourceSet resourceSet);
/**
* Return true if setEcoreModel has defined the Ecore Model context.
*/
boolean hasEcoreModel();
/**
* Set the Ecore Model context of the resource from a list of URIs of the Ecore Packages relative to the
* genModelURI, and a map of the package namespace URI to package descriptor.
*/
void setEcoreModel(@NonNull List<@NonNull String> genModelRelativeEcorePackageUris, @NonNull Map<@NonNull String, @NonNull IPackageDescriptor> nsURI2packageDescriptor);
/**
* Unload the package registry to force a reload.
*/
void unload(@NonNull ResourceSet resourceSet);
}
/**
* An IResourceLoadStrategy determines how each of the possible forms of URI reference to an EPackage should loaded.
*/
public static interface IResourceLoadStrategy
{
/**
* Respond to the explicit addition of a yet to be loaded Ecore model in the user's ResourceSet.
*/
void addedDynamicResource(@NonNull IResourceLoadStatus resourceLoadStatus, @NonNull Resource resource);
/**
* Respond to the explicit addition of a generated EPackage in the user's ResourceSet.
*/
void addedGeneratedPackage(@NonNull IPackageLoadStatus packageLoadStatus, @NonNull EPackage ePackage);
/**
* Return the EPackage in response to an EPackage.Registry access through an EPackageDescriptor, null if not loaded.
*/
@Nullable EPackage basicGetEPackage(@NonNull IPackageLoadStatus packageLoadStatus);
/**
* Configure the resourceLoadStatus to udse this strategy and a conflictHandler.
*/
void configure(@NonNull IResourceLoadStatus resourceLoadStatus, @Nullable IConflictHandler conflictHandler);
/**
* Load and return the EPackage in response to an EPackage.Registry access through an EPackageDescriptor.
*/
@Nullable EPackage getEPackage(@NonNull IPackageLoadStatus packageLoadStatus);
/**
* Respond to the platform/plugin access to a resource with a resourceLoadStatus containing a
* package already accessed as the Java generated ePackage,
*/
void handleConflictingDynamicResource(@NonNull IResourceLoadStatus resourceLoadStatus, @NonNull EPackage ePackage);
/**
* Respond to the loading of a dynamic Ecore model in the user's ResourceSet.
*/
void loadedDynamicResource(@NonNull IResourceLoadStatus packageLoadStatus, @NonNull Resource resource);
/**
* Respond to the notification that the resource has been unloaded.
*/
void unloadedResource(@NonNull IResourceLoadStatus resourceLoadStatus);
/**
* Respond to the explicit notification of a generated resource.
*/
void useGeneratedResource(@NonNull IResourceLoadStatus resourceLoadStatus, @NonNull Resource resource);
}
/**
* An IResourceLoadStatus maintains the lazy load state of a resource associated with a genmodel
* identified by an IResourceDescriptor within a ResourceSet.
*/
public static interface IResourceLoadStatus
{
/**
* Configure the ResourceSet.URIResourceMap to resolve platform:/plugin and platform:/resource
* references to a pseudo resource that delegates to generated packages.
*/
void configureDelegatingResource();
/**
* Configure the EPackage.Registry to resolve namesapce URI references to the specified resource.
*/
void configureEPackageRegistry(@NonNull Resource resource);
/**
* Configure the ResourceSet.URIResourceMap to resolve platform:/plugin and platform:/resource
* references to the specified resource.
*/
void configureResourceSetURIResourceMap(@NonNull Resource resource);
/**
* Dispose of all facilities used by the IResourceLoadStatus, and remove all EPackageDescriptor entries.
*/
void dispose();
/**
* Return the EPackage to be used for a platform-resource/plugin URI after a namespace URI has already been loaded.
*/
@Nullable EPackage getConflictingDynamicResource(@NonNull EPackage ePackage);
/**
* Return the first loaded EPackage which may be part of a model or a Java generated EPackageinstance..
*/
@Nullable EPackage getFirstEPackage();
/**
* Return the package load status for the package identified by packageDescriptor
*/
@Nullable IPackageLoadStatus getPackageLoadStatus(@NonNull IPackageDescriptor packageDescriptor);
/**
* Return the descriptor for the resource.
*/
@NonNull IResourceDescriptor getResourceDescriptor();
/**
* Return the configured resource loading strategy.
*/
@NonNull IResourceLoadStrategy getResourceLoadStrategy();
/**
* Return the package registry maintained by this resource load status
*/
EPackage.@NonNull Registry getPackageRegistry();
/**
* Return the ResourceSet to which the resource logically belongs. (Note that generated EPackage may have
* a null actual ResourceSet, but a non-null logical ResourceSet.)
*/
@Nullable ResourceSet getResourceSet();
/**
* Load and return the EPackage appropriate to the platform resource or plugin resource using nsURI to identify
* a conflicting nsURI access,
*/
@Nullable Resource loadDynamicResource(@NonNull URI nsURI);
/**
* Load all the Java generated EPackage instances for the resource.
*/
void loadGeneratedPackages();
/**
* Define a new conflict handler.
*/
void setConflictHandler(@Nullable IConflictHandler conflictHandler);
/**
* Set true by AS2Ecore to inhibit auto-loading of newly added EPackages.
*
* @deprecated - try using a CreateStrategy instead, see Bug 465326
*/
@Deprecated
void setGenerationInProgress(boolean isGenerating);
/**
* Define the resource once it has been loaded.
*/
void setResource(@NonNull Resource resource);
/**
* Define a new package load strategy.
*/
void setResourceLoadStrategy(@NonNull IResourceLoadStrategy resourceLoadStrategy);
/**
* Reset the status following notification that the model has been unloaded.
*/
void unloadedResource();
}
void addResourceDescriptor(@NonNull IResourceDescriptor resourceDescriptor);
void configure(@NonNull ResourceSet resourceSet, @NonNull IResourceLoadStrategy instance, @Nullable IConflictHandler instance2);
/**
* Configure the use of nsURI within resourceSet to use the first loaded package. This is almost always
* needed for Ecore.ecore since Ecore.ecore referemces its ownm nsURI. It may also be needed for
* nsURIs whose genmodels are in use since they too must use non nsURI access.
*
* @since 1.8
*/
default void configureLoadFirst(@NonNull ResourceSet resourceSet, /*@NonNull*/ String nsURI) {}
IPackageDescriptor getPackageDescriptor(@NonNull URI ecoreURI);
/**
* @since 1.3
*/
@Nullable IResourceDescriptor getResourceDescriptor(@NonNull URI uri);
void initializeResourceSet(@Nullable ResourceSet resourceSet);
boolean isGlobal();
/**
* @since 1.3
*/
void removeResourceDescriptor(@NonNull IResourceDescriptor resourceDescriptor);
void unload(@NonNull ResourceSet resourceSet);
void useGeneratedResource(@NonNull Resource resource, @NonNull ResourceSet resourceSet);
}