/* * 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.extension.ui.wizards; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.util.Collection; import java.util.Map.Entry; 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.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.INewWizard; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.ide.IDE; import org.teiid.core.designer.util.CoreStringUtil; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.workspace.DotProjectUtils; import org.teiid.designer.core.workspace.ModelUtil; import org.teiid.designer.extension.ExtensionPlugin; import org.teiid.designer.extension.definition.ModelExtensionAssistant; import org.teiid.designer.extension.definition.ModelExtensionDefinition; import org.teiid.designer.extension.definition.ModelExtensionDefinitionWriter; import org.teiid.designer.extension.properties.ModelExtensionPropertyDefinition; import org.teiid.designer.extension.ui.Messages; import org.teiid.designer.ui.PluginConstants; import org.teiid.designer.ui.UiPlugin; 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.ModelerUiViewUtils; /** * NewMedWizard - handles creating of new MEDs */ public final class NewMedWizard extends AbstractWizard implements INewWizard, CoreStringUtil.Constants { private NewMedMainPage newMedMainPage; private NewMedDetailsPage newMedDetailsPage; private final ModelExtensionDefinition medBeingCopied; /** * @since 7.6 */ public NewMedWizard() { this(Messages.newMedWizardTitle, null); } /** * @param wizardTitle the window title (should not be <code>null</code> or empty) * @param medBeingCopied the MED being copied (can be <code>null</code>) * @since 7.6 */ public NewMedWizard(String wizardTitle, ModelExtensionDefinition medBeingCopied) { super(UiPlugin.getDefault(), wizardTitle, null); this.medBeingCopied = medBeingCopied; } ModelExtensionDefinition accessMed() { return this.medBeingCopied; } /** * @see org.eclipse.jface.wizard.IWizard#performFinish() * @since 7.6 */ @Override public boolean finish() { // create MED resource final IRunnableWithProgress op = new IRunnableWithProgress() { /** * {@inheritDoc} * * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor) */ @Override @SuppressWarnings("unchecked") public void run( final IProgressMonitor monitor ) throws InvocationTargetException { try { // Get Folder Location and Name of the file to create final IContainer folderLoc = NewMedWizard.this.newMedMainPage.getFolderLocation(); final String medName = NewMedWizard.this.newMedMainPage.getMedName(); final IFile createdMedFile = folderLoc.getFile(new Path(medName)); final ModelExtensionDefinitionWriter medWriter = new ModelExtensionDefinitionWriter(); final ModelExtensionDefinition med = createDefaultMed(); final String namespacePrefix = NewMedWizard.this.newMedDetailsPage.getNamespacePrefix(); final String namespaceUri = NewMedWizard.this.newMedDetailsPage.getNamespaceUri(); final String metamodelUri = NewMedWizard.this.newMedDetailsPage.getMetamodelUri(); final int versionInt = NewMedWizard.this.newMedDetailsPage.getVersionInt(); final String description = NewMedWizard.this.newMedDetailsPage.getDescription(); final Collection<String> supportedModelTypes = NewMedWizard.this.newMedDetailsPage.getSupportedModelTypes(); med.setNamespacePrefix(namespacePrefix); med.setNamespaceUri(namespaceUri); med.setMetamodelUri(metamodelUri); med.setVersion(versionInt); med.setDescription(description); for (String modelType : supportedModelTypes) { med.addModelType(modelType); } // if copying an existing MED copy the properties if (accessMed() != null) { final ModelExtensionDefinition medToCopy = accessMed(); for (final Entry<String, Collection<ModelExtensionPropertyDefinition>> entry : medToCopy.getPropertyDefinitions().entrySet()) { final String metaclass = entry.getKey(); for (final ModelExtensionPropertyDefinition propDefn : entry.getValue()) { ModelExtensionPropertyDefinition copiedProp = (ModelExtensionPropertyDefinition)propDefn.clone(); copiedProp.setNamespaceProvider(med); med.addPropertyDefinition(metaclass, copiedProp); } } } final InputStream medInputStream = medWriter.writeAsStream(med); createdMedFile.create(medInputStream, false, monitor); folderLoc.refreshLocal(IResource.DEPTH_INFINITE, monitor); // open editor - if checkbox is selected if (NewMedWizard.this.newMedMainPage.openInEditorChecked()) { IWorkbenchPage page = UiPlugin.getDefault().getCurrentWorkbenchWindow().getActivePage(); IDE.openEditor(page, createdMedFile); } } catch (final Exception err) { throw new InvocationTargetException(err); } finally { monitor.done(); } } }; try { new ProgressMonitorDialog(getShell()).run(false, true, op); return true; } catch (Throwable err) { if (err instanceof InvocationTargetException) { err = ((InvocationTargetException)err).getTargetException(); } ModelerCore.Util.log(IStatus.ERROR, err, err.getMessage()); WidgetUtil.showError(Messages.newMedWizardCreateFileErrorMsg); return false; } } /** * @return a default ModelExtensionDefinition (never <code>null</code>) */ ModelExtensionDefinition createDefaultMed() { ModelExtensionAssistant assistant = ExtensionPlugin.getInstance().createDefaultModelObjectExtensionAssistant(); ModelExtensionDefinition newMed = new ModelExtensionDefinition(assistant); return newMed; } /** * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection) * @since 7.6 */ @Override public void init(final IWorkbench workbench, final IStructuredSelection selection) { IContainer folderLocation = null; // Get folder from selection if (selection != null && !selection.isEmpty()) { folderLocation = ModelUtil.getContainer(selection.getFirstElement()); // If no container was selected, set to the first open project found. user can re-select if desired. } else { if (!ModelerUiViewUtils.workspaceHasOpenModelProjects()) { IProject newProject = ModelerUiViewUtils.queryUserToCreateModelProject(); if (newProject != null) { folderLocation = newProject; } } Collection<IProject> openModelProjects = DotProjectUtils.getOpenModelProjects(); if( !openModelProjects.isEmpty() ) { folderLocation = openModelProjects.iterator().next(); } } if (folderLocation == null || !folderInModelProject(folderLocation)) { // Create empty page addPage(NoOpenProjectsWizardPage.getStandardPage()); } else { newMedMainPage = new NewMedMainPage(folderLocation); newMedDetailsPage = new NewMedDetailsPage(this.medBeingCopied); addPage(newMedMainPage); addPage(newMedDetailsPage); } } private boolean folderInModelProject(IContainer folderLoc) { boolean result = false; if (folderLoc != null) { IProject project = folderLoc.getProject(); try { if (project != null && project.getNature(PluginConstants.MODEL_PROJECT_NATURE_ID) != null) { result = true; } } catch (CoreException ex) { ModelerCore.Util.log(IStatus.ERROR, ex, ex.getMessage()); } } return result; } Composite createEmptyPageControl(final Composite parent) { return new Composite(parent, SWT.NONE); } }