/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.core.workspace;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.resource.Resource;
import org.teiid.designer.core.metamodel.MetamodelDescriptor;
import org.teiid.designer.metamodels.core.ModelAnnotation;
import org.teiid.designer.metamodels.core.ModelImport;
import org.teiid.designer.metamodels.core.ModelType;
/**
* A ModelResource is an {@link org.eclipse.core.resources.IResource Eclipse resource}
* that are models that can be understood by the Modeler.
* <p>
* If a model resource cannot be parsed, its structure remains unknown. Use
* {@link ModelWorkspaceItem#isStructureKnown()} to determine whether this is the
* case.
* </p>
* <p>
* Model resource items need to be opened before they can be navigated or manipulated.
* The children are of type {@link ModelImport} and {@link org.eclipse.emf.ecore.EObject},
* and appear in the order in which they are declared in the source.
* </p>
* <p>
* This interface is not intended to be implemented by clients.
* </p>
*
* @since 8.0
*/
public interface ModelResource extends ModelWorkspaceItem, Openable {
/**
* Constants indicating if the ModelResource is indexed.
*/
// ModelResource is not indexed
int NOT_INDEXED = 0;
// only metadata indexes have been created for the model Resource
int METADATA_INDEXED = 1;
// only search indexes have been created for the model Resource
int SEARCH_INDEXED = 2;
// ModelResource is compleately indexed
int INDEXED = 3;
/**
* Return for the primary metamodel in this model
* @return the primary metamodel URI string; may be null if
* the primary metamodel is not registered
*/
String getPrimaryMetamodelUri() throws ModelWorkspaceException;
/**
* Return the {@link org.teiid.designer.metamodels.core.ModelType} for this
* resource. The model type information is obtained by either reading
* the model file header information or by examining the model annotation
* node depending on whether the resource has been opened. If the type
* cannot be determined then ModelType.PHYSICAL will be returned as the default.
* @return
*/
ModelType getModelType() throws ModelWorkspaceException;
/**
* Return the description string defined for this resource or null
* if one does not exist. The description information is obtained by either
* reading the model file header information or by examining the model
* annotation node depending on whether the resource has been opened.
* @return
*/
String getDescription() throws ModelWorkspaceException;
/**
* Return the UUID string defined for this resource or null
* if one does not exist. The UUID is obtained by either
* reading the model file header information or by examining the model
* annotation node depending on whether the resource has been opened.
* @return
*/
String getUuid() throws ModelWorkspaceException;
/**
* Return the {@link ModelAnnotation model annotation} for this
* resource.
* <p>
* This method requires opening and parsing the resource and materializing
* the objects within the model, and will result in an {@link #getEmfResource() EMF resource}
* being created for this model resource if one does not already exist.
* </p>
* @return the annotation for the model resource itself; never null
* @throws ModelWorkspaceException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
ModelAnnotation getModelAnnotation() throws ModelWorkspaceException;
/**
* Return the {@link ModelAnnotations model annotation} for this
* resource.
* <p>
* This method requires opening and parsing the resource and materializing
* the objects within the model, and will result in an {@link #getEmfResource(boolean) EMF resource}
* being created for this model resource if one does not already exist.
* </p>
* @param force param used to determine whether to create underlying java.io.File for resource
* if it does not exist or to throw RuntimeException if force is false and File does not exist.
* @return the annotation for the model resource itself; never null
* @throws ModelWorkspaceException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
// ModelAnnotation getModelAnnotation(final boolean force) throws ModelWorkspaceException;
/**
* Return the {@link ModelDiagrams model diagrams} for this
* resource. All ModelResource instances have a {@link ModelDiagrams}
* object. However, since not all resources have diagrams, the
* resulting {@link ModelDiagrams} may be empty.
* <p>
* This method requires opening and parsing the resource and materializing
* the objects within the model, and will result in an {@link #getEmfResource(boolean) EMF resource}
* being created for this model resource if one does not already exist.
* </p>
* @return the container of the diagrams in this resource; never null
* @throws ModelWorkspaceException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
ModelDiagrams getModelDiagrams() throws ModelWorkspaceException;
/**
* Return the {@link ModelTransformations object transformations} for this
* resource. All ModelResource instances have a {@link ModelTransformations}
* object. However, since not all resources have transformations, the
* resulting {@link ModelTransformations} may be empty.
* <p>
* This method requires opening and parsing the resource and materializing
* the objects within the model, and will result in an {@link #getEmfResource(boolean) EMF resource}
* being created for this model resource if one does not already exist.
* </p>
* @return the container of the transformations in this resource; never null
* @throws ModelWorkspaceException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
ModelTransformations getModelTransformations() throws ModelWorkspaceException;
/**
* Return the {@link ModelMappingClassSets mapping class sets} for this
* resource. All ModelResource instances have a {@link ModelMappingClassSets}
* object. However, since not all resources have mapping classe sets, the
* resulting {@link ModelMappingClassSets} may be empty.
* <p>
* This method requires opening and parsing the resource and materializing
* the objects within the model, and will result in an {@link #getEmfResource(boolean) EMF resource}
* being created for this model resource if one does not already exist.
* </p>
* @return the container of the {@link org.teiid.designer.metamodels.transformation.MappingClassSet}
* objects in this resource; never null
* @throws ModelWorkspaceException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
ModelMappingClassSets getModelMappingClassSets() throws ModelWorkspaceException;
/**
* Return true if an open buffer exists for this ModelResource
*/
public boolean isLoaded();
/**
* Unload the model and lose any changes that have been made so far.
*/
public void unload();
/**
* Return whether this resource has errors upon opening. Calling this method will result in the
* model being loaded. If there are no errors, this method returns <code>false</code>.
* @return true if this resource has errors that occurred during opening
* @since 4.2
* @see #getErrors()
*/
public boolean hasErrors();
/**
* Return any errors that occurred upon opening. Calling this method will result in the
* model being loaded. If there are no errors, this method returns an {@link IStatus#OK OK status}.
* @return the errors as an {@link IStatus}
* @since 4.2
* @see #hasErrors()
*/
public IStatus getErrors();
/**
* Return the index type for this model resource. The index type is one among
* constants defined on the ModleResource. It can be one among the types
* <LI>ModelResource.NOT_INDEXED<LI>
* <LI>ModelResource.METADATA_INDEXED<LI>
* <LI>ModelResource.SEARCH_INDEXED<LI>
* <LI>ModelResource.INDEXED<LI>
* The index type can be used to determine if the resource needs to be indexed,
* and what type of index needs to be created for the modleResource.
* @return int indicating the type of indexes created for the resource.
*/
public int getIndexType();
/**
* Set the index type on this model resource. The index type is one among
* constants defined on the ModleResource. It can be one among the types
* <LI>ModelResource.NOT_INDEXED<LI>
* <LI>ModelResource.METADATA_INDEXED<LI>
* <LI>ModelResource.SEARCH_INDEXED<LI>
* <LI>ModelResource.INDEXED<LI>
* The index type can be used to determine if the resource needs to be indexed,
* and what type of index needs to be created for the modleResource.
* @param indexType indicating the type of indexes created for the resource.
*/
public void setIndexType(int indexType);
/**
* Refresh the index type for this model resource. The index type is one among
* constants defined on the ModleResource. It can be one among the types
* <LI>ModelResource.NOT_INDEXED<LI>
* <LI>ModelResource.METADATA_INDEXED<LI>
* <LI>ModelResource.SEARCH_INDEXED<LI>
* <LI>ModelResource.INDEXED<LI>
* The index type can be used to determine if the resource needs to be indexed,
* and what type of index needs to be created for the modleResource.
* @return int indicating the type of indexes created for the resource.
*/
void refreshIndexType();
/**
* Return the {@link ModelObjectAnnotations object annotations} for this
* resource. All ModelResource instances have a {@link ModelObjectAnnotations}
* object. However, annotations on objects are only created when requested, so it is possible
* that if there are not yet any annotated objects, the resulting resulting {@link ModelObjectAnnotations}
* may be empty.
* <p>
* This method requires opening and parsing the resource and materializing
* the objects within the model, and will result in an {@link #getEmfResource(boolean) EMF resource}
* being created for this model resource if one does not already exist.
* </p>
* @return the container of the annotations in this resource; never null
* @throws ModelWorkspaceException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
ModelObjectAnnotations getAnnotations() throws ModelWorkspaceException;
// /**
// * Return the {@link ModelImports model import container} for this
// * resource.
// * <p>
// * This method requires opening and parsing the resource and materializing
// * the objects within the model, and will result in an {@link #getEmfResource(boolean) EMF resource}
// * being created for this model resource if one does not already exist.
// * </p>
// * <p>
// * The returned object is also returned in the result of the {@link #getChildren()} method.
// * </p>
// * @return the container of the model imports in this resource; never null
// * @throws ModelWorkspaceException if this element does not exist or if an
// * exception occurs while accessing its corresponding resource
// */
// ModelImports getModelImportContainer() throws ModelWorkspaceException;
//
// /**
// * Return the {@link MetamodelImports metamodel import container} for this
// * resource.
// * <p>
// * This method requires opening and parsing the resource and materializing
// * the objects within the model, and will result in an {@link #getEmfResource(boolean) EMF resource}
// * being created for this model resource if one does not already exist.
// * </p>
// * <p>
// * The returned object is also returned in the result of the {@link #getChildren()} method.
// * </p>
// * @return the container of the metamodel imports in this resource; never null
// * @throws ModelWorkspaceException if this element does not exist or if an
// * exception occurs while accessing its corresponding resource
// */
// MetamodelImports getMetamodelImportContainer() throws ModelWorkspaceException;
/**
* Return the {@link org.eclipse.emf.ecore.EObject model objects} that are
* considered the root model objects in this resource, excluding the "hidden" model objects
* such as the {@link org.teiid.designer.metamodels.diagram.DiagramContainer DiagramContainer}.
* <p>
* This method requires opening and parsing the resource and materializing
* the objects within the model, and will result in an {@link #getEmfResource(boolean) EMF resource}
* being created for this model resource if one does not already exist.
* </p>
* <p>
* This list is a copy of the underlying list, so changes will not be reflected in the underlying
* resource.
* </p>
* @return the container of the metamodel imports in this resource; never null
* @throws ModelWorkspaceException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
List getEObjects() throws ModelWorkspaceException;
/**
* Return the {@link org.eclipse.emf.ecore.EObject model objects} that are
* considered the root model objects in this resource.
* <p>
* This method requires opening and parsing the resource and materializing
* the objects within the model, and will result in an {@link #getEmfResource(boolean) EMF resource}
* being created for this model resource if one does not already exist.
* </p>
* <p>
* This is the mutable {@link EList} returned from the {@link Resource#getContents()}.
* </p>
* @return the container of the metamodel imports in this resource; never null
* @throws ModelWorkspaceException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
List getAllRootEObjects() throws ModelWorkspaceException;
/**
* Return the {@link Resource EMF resource} that represents this model resource.
* An EMF resource is used as the location into which the model contents are
* materialized. Calling this method will cause an EMF resource to be created
* if one does not currently exist for this resource or if one does exist it
* will cause the EMF resource to be loaded.
* @return the EMF resource, or <code>null</code> if the model resource has not
* yet been parsed and materialized.
* @throws ModelWorkspaceException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
Resource getEmfResource() throws ModelWorkspaceException;
/**
* Return the MetamodelDescriptor for the primary metamodel in this model
* @return the MetamodelDescriptor; may be null if the primary metamodel is not
* registered
* @throws ModelWorkspaceException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
MetamodelDescriptor getPrimaryMetamodelDescriptor() throws ModelWorkspaceException;
/**
* Return the list of MetamodelDescriptor instances for those metamodels used by
* this model.
* @return the MetamodelDescriptor instances, with the primary metamodel
* descriptor being first.
* @throws ModelWorkspaceException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
List getAllMetamodelDescriptors() throws ModelWorkspaceException;
/**
* Return the list of ModelImport instances for those models used by
* this model. Each ModelImport instance will contain, at minimum,
* the absolute path to the model and the ModelType information.
* @return the ModelImport instances.
* @throws ModelWorkspaceException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
List getModelImports() throws ModelWorkspaceException;
/**
* Return true if the ModelResource represents an XSD Resource
*/
boolean isXsd();
/**
* Returns the value of the '<em><b>Target Namespace</b></em>' attribute
* if the ModelResource represents an XSD resource otherwise null is
* returned.
* @return the value of the '<em>Target Namespace</em>' attribute.
* @throws ModelWorkspaceException if an exception occurs while accessing
* its corresponding resource
*/
String getTargetNamespace() throws ModelWorkspaceException;
}