/* * 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.ui.wizards; import java.util.Properties; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PartInitException; import org.eclipse.ui.dialogs.WizardNewProjectCreationPage; import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard; import org.teiid.core.designer.util.CoreArgCheck; import org.teiid.core.designer.util.CoreStringUtil; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.validation.ValidationProblem; import org.teiid.designer.core.validation.ValidationProblemImpl; import org.teiid.designer.core.validation.ValidationResult; import org.teiid.designer.core.validation.ValidationResultImpl; import org.teiid.designer.core.validation.rules.StringNameValidator; import org.teiid.designer.ui.UiConstants; import org.teiid.designer.ui.common.product.ProductCustomizerMgr; import org.teiid.designer.ui.common.util.UiUtil; import org.teiid.designer.ui.common.util.WidgetFactory; import org.teiid.designer.ui.common.wizard.AbstractWizardPage; import org.teiid.designer.ui.explorer.ModelExplorerResourceNavigator; import org.teiid.designer.ui.viewsupport.DesignerPropertiesUtil; import org.teiid.designer.ui.viewsupport.IPropertiesContext; /** * @since 8.0 */ public class NewModelProjectWizard extends BasicNewProjectResourceWizard implements IPropertiesContext, UiConstants { private static String SOURCES = getString("sources"); //$NON-NLS-1$ private static String VIEWS = getString("views"); //$NON-NLS-1$ private static String SCHEMAS = getString("schemas"); //$NON-NLS-1$ private static String FUNCTIONS = getString("functions"); //$NON-NLS-1$ private static String EXTENSIONS =getString("extensions"); //$NON-NLS-1$ private static String WEB_SERVICES =getString("web_services"); //$NON-NLS-1$ public static final String THIS_CLASS = "NewModelProjectWizard"; //$NON-NLS-1$ private static String getString( String key ) { return UiConstants.Util.getString(THIS_CLASS + '.' + key); } private static String getString( String key, String parameter ) { return UiConstants.Util.getString(THIS_CLASS + '.' + key, parameter); } private Properties designerProperties; private ProjectTemplateOptionsPage optionsPage; /** * @see org.eclipse.jface.wizard.IWizard#addPages() * @since 4.2 - added to address defect 15096 */ @Override public void addPages() { super.addPages(); IWizardPage mainPage = super.getPage("basicNewProjectPage"); //$NON-NLS-1$ mainPage.setTitle(Util.getString("NewModelProjectWizard.title")); //$NON-NLS-1$ mainPage.setDescription(Util.getString("NewModelProjectWizard.description")); //$NON-NLS-1$ setWindowTitle(Util.getString("NewModelProjectWizard.title")); //$NON-NLS-1$ optionsPage = new ProjectTemplateOptionsPage(); this.addPage(optionsPage); } //============================================================================================================================ // Constants private static final String[] MODEL_NATURES = new String[] {ModelerCore.NATURE_ID}; //============================================================================================================================ // BasicNewProjectResourceWizard Methods /** * @see org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard#performFinish() * @since 4.0 */ @Override public boolean performFinish() { // Check the project name validity before proceeding IWizardPage mainPage = super.getPage("basicNewProjectPage"); //$NON-NLS-1$ if(mainPage instanceof WizardNewProjectCreationPage) { String projName = ((WizardNewProjectCreationPage)mainPage).getProjectName(); final ValidationResultImpl result = new ValidationResultImpl(projName); // Prevent usage of this list of chars in project names checkInvalidChars(result, projName, UiConstants.NamingAttributes.VALID_PROJECT_CHARS); if (result.hasProblems()) { String eMsg = Util.getString("NewModelProjectWizard.namingError.msg") + '\n' + //$NON-NLS-1$ result.getProblems()[0].getMessage(); String eTitle = Util.getString("NewModelProjectWizard.namingError.title"); //$NON-NLS-1$ MessageDialog.openWarning( getShell(), eTitle, eMsg ); return false; } // Prevent usage of the list of reserved project names checkReservedProjName(result, projName); if (result.hasProblems()) { String eMsg = Util.getString("NewModelProjectWizard.namingError.msg") + '\n' + //$NON-NLS-1$ result.getProblems()[0].getMessage(); String eTitle = Util.getString("NewModelProjectWizard.namingError.title"); //$NON-NLS-1$ MessageDialog.openWarning( getShell(), eTitle, eMsg ); return false; } } super.performFinish(); final IProject project = getNewProject(); if (project == null) return false; try { final IProjectDescription desc = project.getDescription(); desc.setNatureIds(MODEL_NATURES); if (ProductCustomizerMgr.getInstance() != null) { String productName = ProductCustomizerMgr.getInstance().getProductName(); if (!CoreStringUtil.isEmpty(productName)) { desc.setComment(productName + ", version " + ModelerCore.ILicense.VERSION); //$NON-NLS-1$ } } project.setDescription(desc, null); // // Defect 11480 - closing and opening the project sets the overlay icon properly // project.close(null); // project.open(null); if( designerProperties != null ) { DesignerPropertiesUtil.setProjectName(designerProperties, project.getName()); DesignerPropertiesUtil.setProjectStatus(this.designerProperties, IPropertiesContext.OPEN_PROJECTS_EXIST); } createFolders(project); /* * Code added to ModelWorkspaceViewerFilter to filter out * non-Model projects will hide a brand-new Model Project because it does not have its * nature at the time the tree is populated and the filter run. Adding an extra * tree refresh at the end of the New Model Project process so we get a second chance to * construct the tree AFTER the new project has its nature established. */ refreshModelExplorerResourceNavigatorTree(); return true; } catch (final CoreException err) { Util.log(IStatus.ERROR, err, err.getMessage()); return false; } } private void createFolders(IProject project) { if( !optionsPage.wasVisible() ) { return; } if( optionsPage.createSources) { if( designerProperties != null ) { DesignerPropertiesUtil.setSourcesFolderName(designerProperties, optionsPage.sourcesStr); } FolderUtil.createFolder(getShell(), project, optionsPage.sourcesStr); } if( optionsPage.createViews ) { if( designerProperties != null ) { DesignerPropertiesUtil.setViewsFolderName(designerProperties, optionsPage.viewsStr); } FolderUtil.createFolder(getShell(), project, optionsPage.viewsStr); } if( optionsPage.createSchema ) { if( designerProperties != null ) { DesignerPropertiesUtil.setSchemaFolderName(designerProperties, optionsPage.schemaStr); } FolderUtil.createFolder(getShell(), project, optionsPage.schemaStr); } if( optionsPage.createWebServices ) { if( designerProperties != null ) { DesignerPropertiesUtil.setWebServiceFolderName(designerProperties, optionsPage.webServicesStr); } FolderUtil.createFolder(getShell(), project, optionsPage.webServicesStr); } if( optionsPage.createFunctions ) { FolderUtil.createFolder(getShell(), project, optionsPage.functionsStr); } if( optionsPage.createExtensions ) { FolderUtil.createFolder(getShell(), project, optionsPage.extensionsStr); } } private void refreshModelExplorerResourceNavigatorTree() { // activate the Model Explorer view (must do this last)optionGroupLabel Display.getCurrent().asyncExec(new Runnable() { @Override public void run() { try { ModelExplorerResourceNavigator view = (ModelExplorerResourceNavigator) UiUtil.getWorkbenchPage().showView(Extensions.Explorer.VIEW); view.getTreeViewer().refresh( true ); } catch (PartInitException err) { Util.log(IStatus.ERROR, err, err.getMessage()); } } }); } private void checkInvalidChars(final ValidationResult result,final String stringToValidate, final char[] validChars) { CoreArgCheck.isNotNull(stringToValidate); CoreArgCheck.isNotNull(result); final StringNameValidator validator = new StringNameValidator(validChars); final String reasonInvalid = validator.checkValidName(stringToValidate); if ( reasonInvalid != null ) { // create validation problem and addit to the resuly ValidationProblem problem = new ValidationProblemImpl(0, IStatus.ERROR, reasonInvalid); result.addProblem(problem); } } private void checkReservedProjName(final ValidationResult result,final String name) { CoreArgCheck.isNotNull(name); CoreArgCheck.isNotNull(result); if(ModelerCore.isReservedProjectName(name)) { String reservedProjMsg = Util.getString("NewModelProjectWizard.reservedProjNameError",name); //$NON-NLS-1$ // create validation problem and addit to the resuly ValidationProblem problem = new ValidationProblemImpl(0, IStatus.ERROR, reservedProjMsg); result.addProblem(problem); } } @Override public void setProperties(Properties props) { this.designerProperties = props; } class ProjectTemplateOptionsPage extends AbstractWizardPage { private String NO_FOLDERS_MESSAGE = getString("noFoldersMessage"); //$NON-NLS-1$ private String CREATE_FOLDER = getString("createFolderOperationLabel"); //$NON-NLS-1$ public boolean createSources = true; public boolean createViews = true; public boolean createSchema = true; public boolean createWebServices = true; public boolean createFunctions = false; public boolean createExtensions = false; private Button sourcesCB; private Button viewsCB; private Button schemaCB; private Button webServicesCB; private Button functionsCB; private Button extensionsCB; private Text sourcesText; private Text viewsText; private Text schemaText; private Text webServicesText; private Text functionsText; private Text extensionsText; public String sourcesStr = SOURCES; public String viewsStr = VIEWS; public String schemaStr = SCHEMAS; public String webServicesStr = WEB_SERVICES; public String functionsStr = FUNCTIONS; public String extensionsStr = EXTENSIONS; private String projectName; private boolean wasVisible = false; public ProjectTemplateOptionsPage() { super(ProjectTemplateOptionsPage.class.getSimpleName(), getString("optionsTitle"));//$NON-NLS-1$ this.setDescription(getString("initialMessage")); //$NON-NLS-1$ } @Override public void createControl( Composite theParent ) { final int COLUMNS = 1; Composite mainPanel = WidgetFactory.createPanel(theParent, SWT.NO_SCROLL, GridData.FILL_BOTH); mainPanel.setLayout(new GridLayout(COLUMNS, false)); setControl(mainPanel); createOptionsPanel(mainPanel); setPageStatus(); } @Override public boolean canFlipToNextPage() { return false; } void setPageStatus() { setMessage(null, IStatus.OK); } private void createOptionsPanel( Composite theParent ) { GridData gd = new GridData(GridData.FILL_BOTH); theParent.setLayoutData(gd); Group folderOptionsGroup = WidgetFactory.createGroup(theParent, getString("optionGroupLabel"), GridData.FILL_HORIZONTAL, 1, 2); //$NON-NLS-1$ // ============ SOURCES FOLDER ==================================================================== sourcesCB = WidgetFactory.createCheckBox(folderOptionsGroup); sourcesCB.setText(CREATE_FOLDER); sourcesCB.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent event) { createSources = sourcesCB.getSelection(); sourcesText.setEnabled(sourcesCB.getSelection()); validate(); } }); sourcesCB.setSelection(createSources); sourcesText = createTextField(folderOptionsGroup, SOURCES, getString("createFolderCheckBoxLabel", SOURCES )); //$NON-NLS-1$ sourcesText.addModifyListener( new ModifyListener() { /** * {@inheritDoc} * * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent) */ @Override public void modifyText( ModifyEvent e ) { sourcesStr = sourcesText.getText(); validate(); } }); sourcesText.setEnabled(createSources); // ============ VIEWS FOLDER ==================================================================== viewsCB = WidgetFactory.createCheckBox(folderOptionsGroup); viewsCB.setText(CREATE_FOLDER); viewsCB.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent event) { createViews = viewsCB.getSelection(); viewsText.setEnabled(viewsCB.getSelection()); validate(); } }); viewsCB.setSelection(createViews); viewsText = createTextField(folderOptionsGroup, VIEWS, getString("createFolderCheckBoxLabel", VIEWS )); //$NON-NLS-1$ viewsText.addModifyListener( new ModifyListener() { /** * {@inheritDoc} * * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent) */ @Override public void modifyText( ModifyEvent e ) { viewsStr = viewsText.getText(); validate(); } }); viewsText.setEnabled(createViews); // ============ SCHEMAS FOLDER ==================================================================== schemaCB = WidgetFactory.createCheckBox(folderOptionsGroup); schemaCB.setText(CREATE_FOLDER); schemaCB.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent event) { createSchema = schemaCB.getSelection(); schemaText.setEnabled(schemaCB.getSelection()); validate(); } }); schemaCB.setSelection(createSchema); schemaText = createTextField(folderOptionsGroup, SCHEMAS, getString("createFolderCheckBoxLabel", SCHEMAS )); //$NON-NLS-1$ schemaText.addModifyListener( new ModifyListener() { /** * {@inheritDoc} * * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent) */ @Override public void modifyText( ModifyEvent e ) { schemaStr = schemaText.getText(); validate(); } }); schemaText.setEnabled(createSchema); // ============ WEB SERVICES FOLDER ==================================================================== webServicesCB = WidgetFactory.createCheckBox(folderOptionsGroup); webServicesCB.setText(CREATE_FOLDER); webServicesCB.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent event) { createWebServices = webServicesCB.getSelection(); webServicesText.setEnabled(webServicesCB.getSelection()); validate(); } }); webServicesCB.setSelection(createWebServices); webServicesText = createTextField(folderOptionsGroup, WEB_SERVICES, getString("createFolderCheckBoxLabel", WEB_SERVICES )); //$NON-NLS-1$ webServicesText.addModifyListener( new ModifyListener() { /** * {@inheritDoc} * * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent) */ @Override public void modifyText( ModifyEvent e ) { webServicesStr = webServicesText.getText(); validate(); } }); webServicesText.setEnabled(createWebServices); // ============ FUNCTIONS FOLDER ==================================================================== functionsCB = WidgetFactory.createCheckBox(folderOptionsGroup); functionsCB.setText(CREATE_FOLDER); functionsCB.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent event) { createFunctions = functionsCB.getSelection(); functionsText.setEnabled(functionsCB.getSelection()); validate(); } }); functionsCB.setSelection(createFunctions); functionsText = createTextField(folderOptionsGroup, FUNCTIONS, getString("createFolderCheckBoxLabel", FUNCTIONS )); //$NON-NLS-1$ functionsText.addModifyListener( new ModifyListener() { /** * {@inheritDoc} * * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent) */ @Override public void modifyText( ModifyEvent e ) { functionsStr = functionsText.getText(); validate(); } }); functionsText.setEnabled(createFunctions); // ============ EXTENSIONS FOLDER ==================================================================== extensionsCB = WidgetFactory.createCheckBox(folderOptionsGroup); extensionsCB.setText(CREATE_FOLDER); extensionsCB.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent event) { createExtensions = extensionsCB.getSelection(); extensionsText.setEnabled(extensionsCB.getSelection()); validate(); } }); extensionsCB.setSelection(createExtensions); extensionsText = createTextField(folderOptionsGroup, EXTENSIONS, getString("createFolderCheckBoxLabel", EXTENSIONS )); //$NON-NLS-1$ extensionsText.addModifyListener( new ModifyListener() { /** * {@inheritDoc} * * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent) */ @Override public void modifyText( ModifyEvent e ) { extensionsStr = extensionsText.getText(); validate(); } }); extensionsText.setEnabled(createExtensions); } private Text createTextField(Composite parent, String text, String tooltip) { Text newText = new Text(parent, SWT.BORDER); newText.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); newText.setText(text); newText.setToolTipText(tooltip); return newText; } public boolean wasVisible() { return wasVisible; } @Override public void setVisible(boolean visible) { super.setVisible(visible); wasVisible = true; } private void validate() { if( !(createSchema || createFunctions || createExtensions || createViews || createSources || createWebServices) ) { // NO POSSIBLE FOLDERS TO CREATE setPageStatus(true, NO_FOLDERS_MESSAGE, null); return; } // check for duplicate names if( createExtensions ) { if( extensionsStr.length() == 0 ) { setPageStatus(false, null, getString("zeroLengthFolderNameError")); //$NON-NLS-1$ return; } if( checkDuplicateName(createSources, extensionsStr, sourcesStr)) return; if( checkDuplicateName(createViews, extensionsStr, viewsStr)) return; if( checkDuplicateName(createSchema, extensionsStr, schemaStr)) return; if( checkDuplicateName(createWebServices, extensionsStr, webServicesStr)) return; if( checkDuplicateName(createFunctions, extensionsStr, functionsStr)) return; } if( createFunctions ) { if( functionsStr.length() == 0 ) { setPageStatus(false, null, getString("zeroLengthFolderNameError")); //$NON-NLS-1$ return; } if( checkDuplicateName(createSources, functionsStr, sourcesStr)) return; if( checkDuplicateName(createViews, functionsStr, viewsStr)) return; if( checkDuplicateName(createSchema, functionsStr, schemaStr)) return; if( checkDuplicateName(createWebServices, functionsStr, webServicesStr)) return; if( checkDuplicateName(createExtensions, functionsStr, extensionsStr)) return; } if( createSources ) { if( sourcesStr.length() == 0 ) { setPageStatus(false, null, getString("zeroLengthFolderNameError")); //$NON-NLS-1$ return; } if( checkDuplicateName(createViews, sourcesStr, viewsStr)) return; if( checkDuplicateName(createSchema, sourcesStr, schemaStr)) return; if( checkDuplicateName(createWebServices, sourcesStr, webServicesStr)) return; if( checkDuplicateName(createFunctions, sourcesStr, functionsStr)) return; if( checkDuplicateName(createExtensions, sourcesStr, extensionsStr)) return; } if( createViews ) { if( viewsStr.length() == 0 ) { setPageStatus(false, null, getString("zeroLengthFolderNameError")); //$NON-NLS-1$ return; } if( checkDuplicateName(createSources, viewsStr, sourcesStr)) return; if( checkDuplicateName(createSchema, viewsStr, schemaStr)) return; if( checkDuplicateName(createWebServices, viewsStr, webServicesStr)) return; if( checkDuplicateName(createFunctions, viewsStr, functionsStr)) return; if( checkDuplicateName(createExtensions, viewsStr, extensionsStr)) return; } if( createSchema ) { if( extensionsStr.length() == 0 ) { setPageStatus(false, null, getString("zeroLengthFolderNameError")); //$NON-NLS-1$ return; } if( checkDuplicateName(createSources, schemaStr, sourcesStr)) return; if( checkDuplicateName(createViews, schemaStr, viewsStr)) return; if( checkDuplicateName(createWebServices, schemaStr, webServicesStr)) return; if( checkDuplicateName(createFunctions, schemaStr, functionsStr)) return; if( checkDuplicateName(createExtensions, schemaStr, extensionsStr)) return; } if( createWebServices ) { if( webServicesStr.length() == 0 ) { setPageStatus(false, null, getString("zeroLengthFolderNameError")); //$NON-NLS-1$ return; } if( checkDuplicateName(createSources, webServicesStr, sourcesStr)) return; if( checkDuplicateName(createViews, webServicesStr, viewsStr)) return; if( checkDuplicateName(createSchema, webServicesStr, schemaStr)) return; if( checkDuplicateName(createFunctions, webServicesStr, functionsStr)) return; if( checkDuplicateName(createExtensions, webServicesStr, extensionsStr)) return; } setPageStatus(true, getString("initialMessage", projectName), null); //$NON-NLS-1$ } private void setPageStatus(boolean complete, String message, String errorMessage) { setErrorMessage(errorMessage); setMessage(message); setPageComplete(complete); } private boolean checkDuplicateName(boolean doCheck, String str1, String str2) { if( doCheck && str1.equalsIgnoreCase(str2) ){ this.setErrorMessage(getString("duplicateFolderNameError", functionsStr)); //$NON-NLS-1$ setPageComplete(false); return true; } return false; } } }