/*
* 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.file;
import java.util.Properties;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IImportWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.teiid.core.designer.util.I18nUtil;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.workspace.ModelResource;
import org.teiid.designer.core.workspace.ModelUtil;
import org.teiid.designer.transformation.ui.UiConstants;
import org.teiid.designer.transformation.ui.UiPlugin;
import org.teiid.designer.ui.common.util.UiUtil;
import org.teiid.designer.ui.common.util.WidgetUtil;
import org.teiid.designer.ui.common.wizard.AbstractWizard;
import org.teiid.designer.ui.common.wizard.NoOpenProjectsWizardPage;
import org.teiid.designer.ui.viewsupport.DesignerPropertiesUtil;
import org.teiid.designer.ui.viewsupport.IPropertiesContext;
import org.teiid.designer.ui.viewsupport.ModelIdentifier;
import org.teiid.designer.ui.viewsupport.ModelerUiViewUtils;
/**
* Import wizard designed to import metadata from one or more Teiid formatted data files and create a relational
* model containing the standard/generated File Connector procedures and create view relational tables containing
* the SQL containing the function call which will return the data from the file in relational table format
*
* @since 8.0
*/
public class TeiidMetadataImportWizard extends AbstractWizard implements
IPropertiesContext, IImportWizard, UiConstants {
private static final String I18N_PREFIX = I18nUtil.getPropertyPrefix(TeiidMetadataImportWizard.class);
private static final String TITLE = getString("title"); //$NON-NLS-1$
private static final ImageDescriptor IMAGE = UiPlugin.getDefault().getImageDescriptor(Images.IMPORT_TEIID_METADATA);
private static String getString( final String id ) {
return Util.getString(I18N_PREFIX + id);
}
private TeiidMetadataImportInfo filesInfo;
private TeiidMetadataImportSourcePage sourcePage;
IContainer folder = null;
private Properties designerProperties;
private boolean openProjectExists = true;
private IProject newProject;
/**
* @since 4.0
*/
public TeiidMetadataImportWizard() {
super(UiPlugin.getDefault(), TITLE, IMAGE);
}
/**
* @param plugin the plugin
* @param title the wizard title
* @param image the wizard image descriptor
*/
public TeiidMetadataImportWizard( final AbstractUIPlugin plugin,
final String title,
final ImageDescriptor image ) {
super(plugin, title, image);
}
@Override
public void init(IWorkbench workbench, IStructuredSelection inputSelection) {
IProject targetProject = null;
IStructuredSelection finalSelection = inputSelection;
// Request User to Create a Model Project - if none open in the workspace.
openProjectExists = ModelerUiViewUtils.workspaceHasOpenModelProjects();
if( !openProjectExists ) {
newProject = ModelerUiViewUtils.queryUserToCreateModelProject();
if( newProject != null ) {
finalSelection = new StructuredSelection(newProject);
targetProject = newProject;
openProjectExists = true;
} else {
addPage(NoOpenProjectsWizardPage.getStandardPage());
return;
}
}
Object selectedObj = finalSelection.getFirstElement();
if( targetProject == null ) {
if( selectedObj instanceof IResource ) {
targetProject = ((IResource)selectedObj).getProject();
}
}
folder = null;
boolean isViewRelationalModel = false;
try {
if (selectedObj instanceof IFile) {
ModelResource modelResource = ModelUtil.getModelResource((IFile)selectedObj, false);
isViewRelationalModel = ModelIdentifier.isRelationalViewModel(modelResource);
}
} catch (Exception e) {
Util.log(e);
}
// If not null, set folder to current selection if a folder or to containing folder if a model object
if (!finalSelection.isEmpty()) {
final Object obj = finalSelection.getFirstElement();
folder = ModelUtil.getContainer(obj);
try {
if (folder != null && folder.getProject().getNature(ModelerCore.NATURE_ID) == null) {
folder = null;
}
} catch (final CoreException err) {
Util.log(err);
WidgetUtil.showError(err);
}
}
// Construct the business object
this.filesInfo = new TeiidMetadataImportInfo();
this.filesInfo.setFileMode(TeiidMetadataImportInfo.FILE_MODE_FLAT_FILE_LOCAL);
this.filesInfo.setTargetProject(targetProject);
// Set initial view model and view model location values if present from selection
if( isViewRelationalModel ) {
this.filesInfo.setViewModelName( ((IFile)selectedObj).getName());
this.filesInfo.setViewModelLocation(((IFile)selectedObj).getFullPath().removeLastSegments(1));
this.filesInfo.setViewModelExists(true);
this.filesInfo.setSourceModelLocation(((IFile)selectedObj).getFullPath().removeLastSegments(1));
}
if( folder != null ) {
this.filesInfo.setSourceModelLocation(folder.getFullPath());
this.filesInfo.setViewModelLocation(folder.getFullPath());
}
}
@Override
public void addPages() {
if( !openProjectExists ) return;
TeiidFlatFileImportOptionsPage flatFileImportOptionsPage = new TeiidFlatFileImportOptionsPage(getFileInfo());
addPage(flatFileImportOptionsPage);
this.sourcePage = new TeiidMetadataImportSourcePage(getFileInfo());
addPage(sourcePage);
addPage(new TeiidMetadataImportDataSourcePage(getFileInfo()));
TeiidMetadataImportFormatPage formatSelectionPage = new TeiidMetadataImportFormatPage(getFileInfo());
addPage(formatSelectionPage);
TeiidMetadataImportOptionsPage optionsPage = new TeiidMetadataImportOptionsPage(getFileInfo());
addPage(optionsPage);
TeiidMetadataImportViewModelPage viewModelPage = new TeiidMetadataImportViewModelPage(getFileInfo());
addPage(viewModelPage);
}
@Override
public void createPageControls(Composite pageContainer) {
// TODO Auto-generated method stub
super.createPageControls(pageContainer);
updateForProperties();
}
@Override
public boolean finish() {
final TeiidMetadataImportProcessor processor = new TeiidMetadataImportProcessor(this.filesInfo, this.getShell());
UiUtil.runInSwtThread(new Runnable() {
@Override
public void run() {
processor.execute();
}
}, false);
// Update Properties to include the created source and view Models
if( this.designerProperties != null ) {
DesignerPropertiesUtil.setSourceModelName(this.designerProperties, getFileInfo().getSourceModelName());
DesignerPropertiesUtil.setViewModelName(this.designerProperties, getFileInfo().getViewModelName());
}
return true;
}
/**
* @return the Teiid metadata import info object
*/
public TeiidMetadataImportInfo getFileInfo() {
return this.filesInfo;
}
@Override
public void setProperties(Properties properties) {
this.designerProperties = properties;
}
public Properties getDesignerProperties() {
return this.designerProperties;
}
protected boolean openProjectExists() {
return this.openProjectExists;
}
protected void updateForProperties() {
if( this.designerProperties == null || this.designerProperties.isEmpty() ) {
return;
}
if (this.folder == null) {
// Check for Sources and View Folder from property definitions
IProject project = DesignerPropertiesUtil.getProject(designerProperties);
IContainer srcFolderResrc = DesignerPropertiesUtil.getSourcesFolder(this.designerProperties);
IContainer viewFolderResrc = DesignerPropertiesUtil.getViewsFolder(this.designerProperties);
if( project != null ) {
getFileInfo().setTargetProject(project);
}
if (srcFolderResrc != null) {
getFileInfo().setSourceModelLocation(srcFolderResrc.getFullPath());
} else if( project != null ) {
getFileInfo().setSourceModelLocation(project.getFullPath());
}
if (viewFolderResrc != null) {
getFileInfo().setViewModelLocation(viewFolderResrc.getFullPath());
} else if( project != null ) {
getFileInfo().setViewModelLocation(project.getFullPath());
}
}
// Check for Connection Profile in properties
String profileName = DesignerPropertiesUtil.getConnectionProfileName(this.designerProperties);
if( profileName != null && !profileName.isEmpty() ) {
// Select profile
sourcePage.selectConnectionProfile(profileName);
}
if( !this.openProjectExists) {
DesignerPropertiesUtil.setProjectStatus(this.designerProperties, IPropertiesContext.NO_OPEN_PROJECT);
}
}
public boolean isOpenProjectExists() {
return openProjectExists;
}
}