/*
* 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.metamodels.builder.execution;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EFactory;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.core.designer.util.I18nUtil;
import org.teiid.designer.metamodels.builder.ModelBuilder;
import org.teiid.designer.metamodels.builder.ModelRecord;
import org.teiid.designer.metamodels.builder.execution.util.MetamodelBuilderUtil;
import org.teiid.designer.metamodels.core.CorePackage;
import org.teiid.designer.metamodels.core.ModelAnnotation;
import org.teiid.designer.metamodels.core.ModelType;
import org.teiid.designer.metamodels.core.extension.ExtensionPackage;
import org.teiid.designer.metamodels.core.extension.XPackage;
import org.teiid.designer.metamodels.relational.RelationalPackage;
/**
* Implementation of the ModelBuilder - creates a Resource given a ModelRecord or List of records.
*
* @since 8.0
*/
public class ModelBuilderImpl implements ModelBuilder, MetamodelBuilderConstants {
private final ResourceSet eResourceSet;
private final MultiStatus status;
private boolean builderDebugEnabled = false;
private static final String I18N_PREFIX = I18nUtil.getPropertyPrefix(ModelBuilderImpl.class);
private static String getString( final String id,
final Object param1,
final Object param2 ) {
return UTIL.getString(I18N_PREFIX + id, param1, param2);
}
// ==================================================================================
// C O N S T R U C T O R S
// ==================================================================================
/**
* Constructor
*
* @param - theContainer - ResourceSet containing all resources (Internal Resoruces should already be added)
* @param - status - The MultiStatus to use to accumulate all warnings and errors
*/
public ModelBuilderImpl( final MultiStatus status,
final ResourceSet resourceSet ) {
CoreArgCheck.isNotNull(resourceSet);
CoreArgCheck.isNotNull(status);
this.eResourceSet = resourceSet;
this.status = status;
}
/**
* Interface method - Create a Model using the given ModelRecord informations
*
* @see org.teiid.designer.metamodels.builder.ModelBuilder#create(org.teiid.designer.metamodels.builder.ModelRecord)
* @param - ModelRecord - the record to use to drive creation - May not be null
* @since 4.3
*/
@Override
public Resource create( ModelRecord record ) {
CoreArgCheck.isNotNull(record);
// Construct absolute model path from record
String absoluteModelPath = getModelAbsolutePath(record);
// Check if a resource with this URI already exists in the resource set.
// If the resource already exists, return it - dont flag as error.
URI uri = URI.createFileURI(absoluteModelPath);
if (this.eResourceSet.getResource(uri, false) != null) {
return this.eResourceSet.getResource(uri, false);
}
// Create the empty resource
Resource eResource = this.eResourceSet.createResource(uri);
// Set resource using record details
initModelResource(eResource, record);
// Add newly created resource to the resource set
this.eResourceSet.getResources().add(eResource);
return eResource;
}
/**
* Interface method - Create a Model using the given ModelRecord informations
*
* @see org.teiid.designer.metamodels.builder.ModelBuilder#create(org.teiid.designer.metamodels.builder.ModelRecord)
* @param - ModelRecord - the record to use to drive creation - May not be null
* @since 4.3
*/
@Override
public List create( List records ) {
CoreArgCheck.isNotNull(records);
List resources = new ArrayList(records.size());
Iterator iter = records.iterator();
while (iter.hasNext()) {
Resource resource = create((ModelRecord)iter.next());
if (resource != null) {
resources.add(resource);
}
}
return resources;
}
// ==================================================================================
// H E L P E R M E T H O D S
// ==================================================================================
// Helper to use to get an absolute path from a record
private String getModelAbsolutePath( ModelRecord record ) {
String locationPath = record.getLocationPath();
String modelName = record.getModelName();
String absolutePath = locationPath + PATH_SEPARATOR + modelName + MODEL_EXT;
return absolutePath;
}
// Helper to initialize a resource
private void initModelResource( Resource modelResource,
ModelRecord record ) {
// Get the details of the model to be created.
String modelType = record.getModelType();
String modelSubType = record.getModelSubType();
String modelNameInSource = record.getModelNameInSource();
String modelDescription = record.getModelDescription();
String extensionPackage = record.getExtensionPackage();
// Create ModelAnnotation
EFactory factory = CorePackage.eINSTANCE.getEFactoryInstance();
ModelAnnotation annot = (ModelAnnotation)factory.create(CorePackage.eINSTANCE.getModelAnnotation());
// --------------------------------
// Relational Model
// --------------------------------
if (RELATIONAL_STR.equalsIgnoreCase(modelType)) {
// Set primary metamodel type
annot.setPrimaryMetamodelUri(RelationalPackage.eNS_URI);
// Set subType
if (PHYSICAL_STR.equalsIgnoreCase(modelSubType)) {
annot.setModelType(ModelType.PHYSICAL_LITERAL);
} else if (VIRTUAL_STR.equalsIgnoreCase(modelSubType)) {
annot.setModelType(ModelType.VIRTUAL_LITERAL);
}
// --------------------------------
// Relationship Model
// --------------------------------
} else if (EXTENSION_STR.equalsIgnoreCase(modelType)) {
// Set primary metamodel type
annot.setPrimaryMetamodelUri(ExtensionPackage.eNS_URI);
// Set subType
annot.setModelType(ModelType.EXTENSION_LITERAL);
}
// Set Model NameInSource
annot.setNameInSource(modelNameInSource);
// Set Model Description
annot.setDescription(modelDescription);
// If the record has an extension package entry... look up the
// XPackage and set that info on the ModelAnnotation
if (extensionPackage != null) {
final Object xPkg = MetamodelBuilderUtil.findEObjectByPath(eResourceSet, extensionPackage, null, status);
if (xPkg != null && xPkg instanceof XPackage) {
annot.setExtensionPackage((XPackage)xPkg);
} else {
// Found wrong entity... log error
final String msg = getString("noXPkg", extensionPackage, modelResource.getURI().lastSegment()); //$NON-NLS-1$
MetamodelBuilderUtil.addStatus(status, IStatus.ERROR, msg);
if (this.builderDebugEnabled) {
MetamodelBuilderExecutionPlugin.Util.log(IStatus.ERROR, msg);
}
}
}
// Add ModelAnnotation
modelResource.getContents().add(annot);
}
}