/*
* 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.transformation.ui.wizards;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.util.ModelContents;
import org.teiid.designer.core.util.ModelResourceContainerFactory;
import org.teiid.designer.core.workspace.ModelResource;
import org.teiid.designer.metamodels.core.Annotation;
import org.teiid.designer.relational.ui.wizards.RelationalObjectProcessor;
import org.teiid.designer.tools.textimport.ui.wizards.AbstractObjectProcessor;
import org.teiid.designer.transformation.ui.UiConstants;
import org.teiid.designer.transformation.ui.textimport.VirtualTableRowObject;
import org.teiid.designer.transformation.ui.util.TransformationDiagramUtil;
import org.teiid.designer.transformation.util.TransformationHelper;
/**
* @since 8.0
*/
public class VirtualRelationalObjectProcessor extends AbstractObjectProcessor {
private static final String I18N_PREFIX = "VirtualRelationalObjectProcessor"; //$NON-NLS-1$
private static final String SEPARATOR = "."; //$NON-NLS-1$
//============================================================================================================================
// Static Methods
private IProgressMonitor monitor;
/**
*
* @since 4.2
*/
public VirtualRelationalObjectProcessor() {
super();
}
public Collection createRowObjsFromStrings(Collection rowStrings) {
Iterator iter = rowStrings.iterator();
String nextStr = null;
Collection stringRows = new ArrayList();
VirtualTableRowObject nextRow = null;
while( iter.hasNext() ) {
nextStr = (String)iter.next();
nextRow = new VirtualTableRowObject(nextStr);
if( nextRow.isValid() )
stringRows.add(nextRow);
else {
logParsingError(nextStr);
}
}
return stringRows;
}
public void generateObjsFromRowObjs(Object targetResource, Object location, Collection tableRows) {
int iRow = 0;
Iterator iter = tableRows.iterator();
EObject bt = null;
VirtualTableRowObject nextRow = null;
String sSize = Integer.toString(tableRows.size());
while( iter.hasNext() ) {
iRow++;
nextRow = (VirtualTableRowObject)iter.next();
if( monitor != null ) {
monitor.worked(1);
monitor.subTask(UiConstants.Util.getString(I18N_PREFIX + SEPARATOR + "incrementalProgress", Integer.toString(iRow), sSize, nextRow.getName())); //$NON-NLS-1$
}
bt = createTable( location, nextRow);
createTransformation(bt, nextRow.getSelectSql(), targetResource);
createAnnotation(targetResource, bt, nextRow.getDescription());
if( monitor != null && monitor.isCanceled() ) {
break;
}
}
}
private void createAnnotation(Object targetResource, EObject eObject, String description) {
if( description != null && description.length() > 0 ) {
ModelContents contents = null;
if(targetResource instanceof ModelResource) {
contents = ModelerCore.getModelEditor().getModelContents((ModelResource)targetResource);
}else if (targetResource instanceof Resource) {
contents = ModelerCore.getModelEditor().getModelContents((Resource)targetResource);
}
Annotation newAnnot = ModelResourceContainerFactory.createNewAnnotation(eObject, contents.getAnnotationContainer(true));
newAnnot.setDescription(description);
}
}
public EObject createSchema(ModelResource modelResource, String schemaName) {
EObject newSchema = RelationalObjectProcessor.createSchema(schemaName, null);
addValue(modelResource, newSchema, getModelResourceContents(modelResource));
return newSchema;
}
private EObject createTable(Object location, VirtualTableRowObject tableRow) {
EObject vTarget = null;
String selectSql = tableRow.getSelectSql();
// Create Procedure if supplied SQL is for a procedure
if(selectSql!=null && selectSql.trim().toUpperCase().startsWith("CREATE")) { //$NON-NLS-1$
vTarget = RelationalObjectProcessor.createProcedure(tableRow.getName());
TransformationHelper.createProcResultSet(vTarget);
// Create BaseTable
} else {
vTarget = RelationalObjectProcessor.createBaseTable(tableRow.getName(), false);
}
if( vTarget != null ) {
if( location instanceof ModelResource ) {
addValue(location, vTarget, getModelResourceContents((ModelResource)location));
} else if( RelationalObjectProcessor.isSchema(location) ) {
addValue(location, vTarget, RelationalObjectProcessor.getTablesEList(location));
} else if( RelationalObjectProcessor.isCatalog(location) ) {
addValue(location, vTarget, RelationalObjectProcessor.getTablesEList(location));
} else if( location instanceof Resource ) {
addValue(location, vTarget, ((Resource)location).getContents());
}
}
return vTarget;
}
private void createTransformation(EObject baseTable, String selectSql, Object resource) {
TransformationHelper.createTransformation(baseTable, selectSql);
if(resource instanceof ModelResource) {
TransformationDiagramUtil.createTransformationDiagram(baseTable, (ModelResource)resource, true);
}
}
public void setProgressMonitor(IProgressMonitor monitor) {
this.monitor = monitor;
}
}