/* * Copyright (c) 2007, 2008 Borland Software Corporation * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Alexander Fedorov (Borland) - initial API and implementation */ package org.eclipse.gmf.internal.bridge.transform; import java.text.MessageFormat; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ProjectScope; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.dialogs.WizardNewFileCreationPage; import org.osgi.service.prefs.Preferences; class GMFGenNewFileCreationPage extends WizardNewFileCreationPage { static final String EXT_GMFGEN = "gmfgen"; //$NON-NLS-1$ private ResourceGroupEmulator resourceGroupEmulator; public GMFGenNewFileCreationPage(IStructuredSelection selection) { super(GMFGenNewFileCreationPage.class.getSimpleName(), selection); setTitle(Messages.TransformToGenModelWizard_title_gmfgen); setDescription(Messages.TransformToGenModelWizard_descr_gmfgen); } @Override public void createControl(Composite parent) { resourceGroupEmulator = new ResourceGroupEmulator(); super.createControl(parent); validateFileExists(); } protected boolean validatePage() { if (emulateValidate()) { // Make sure the file ends in ".gmfgen". // String enteredExt = new Path(getFileName()).getFileExtension(); if (enteredExt == null || !enteredExt.equals(EXT_GMFGEN)) { String pattern = Messages.GMFGenNewFileCreationPage_e_filename; setErrorMessage(MessageFormat.format(pattern, new Object[] { EXT_GMFGEN })); return false; } else { validateFileExists(); // TODO provide an option (prefpage or e.g. CTRL on kbd while wizard starts) whether toolsmith like // to keep project-relative settings (for those who hate /project/.settings/ folder, as I do) // e.g. Platform.getPreferenceService().getBoolean("oeg.bridge.ui", "transf-settings-per-gmfgen", true, null) Preferences contextOptions = new ProjectScope(getModelFile().getProject()).getNode(getFileName()); ((TransformToGenModelWizard) getWizard()).getTransformOperation().getOptions().setContext(contextOptions); return true; } } else { return false; } } private void validateFileExists() { IPath resourcePath = getContainerFullPath().append(getFileName()); if (isFileExists(resourcePath)) { setMessage(Messages.ResourceGroup_nameExists, IMessageProvider.WARNING); } } public IFile getModelFile() { return ResourcesPlugin.getWorkspace().getRoot().getFile(getContainerFullPath().append(getFileName())); } private boolean emulateValidate() { boolean valid = true; if (!resourceGroupEmulator.validateControls()) { // if blank name then fail silently if (resourceGroupEmulator.getProblemType() == ResourceGroupEmulator.PROBLEM_RESOURCE_EMPTY || resourceGroupEmulator.getProblemType() == ResourceGroupEmulator.PROBLEM_CONTAINER_EMPTY) { setMessage(resourceGroupEmulator.getProblemMessage()); setErrorMessage(null); } else { setErrorMessage(resourceGroupEmulator.getProblemMessage()); } valid = false; } String resourceName = getFileName(); IWorkspace workspace = ResourcesPlugin.getWorkspace(); IStatus result = workspace.validateName(resourceName, IResource.FILE); if (!result.isOK()) { setErrorMessage(result.getMessage()); return false; } IStatus linkedResourceStatus = null; if (valid) { linkedResourceStatus = validateLinkedResource(); if (linkedResourceStatus.getSeverity() == IStatus.ERROR) { valid = false; } } // validateLinkedResource sets messages itself if (valid && (linkedResourceStatus == null || linkedResourceStatus.isOK())) { setMessage(null); setErrorMessage(null); } return valid; } boolean isFileExists(IPath resourcePath) { if (resourcePath == null) { return false; } IWorkspace workspace = ResourcesPlugin.getWorkspace(); return (workspace.getRoot().getFolder(resourcePath).exists() || workspace.getRoot().getFile(resourcePath).exists()); } // XXX: remove after fix of https://bugs.eclipse.org/bugs/show_bug.cgi?id=172000 private class ResourceGroupEmulator { static final int PROBLEM_NONE = 0; static final int PROBLEM_RESOURCE_EMPTY = 1; static final int PROBLEM_RESOURCE_EXIST = 2; static final int PROBLEM_PATH_INVALID = 4; static final int PROBLEM_CONTAINER_EMPTY = 5; static final int PROBLEM_PROJECT_DOES_NOT_EXIST = 6; static final int PROBLEM_NAME_INVALID = 7; static final int PROBLEM_PATH_OCCUPIED = 8; private boolean allowExistingResources = true; private String problemMessage = "";//$NON-NLS-1$ private int problemType = PROBLEM_NONE; ResourceGroupEmulator() { // just create } boolean validateControls() { // don't attempt to validate controls until they have been created try { getFileName(); } catch (Exception e) { return false; } problemType = PROBLEM_NONE; problemMessage = "";//$NON-NLS-1$ if (!validateContainer() || !validateResourceName()) { return false; } IPath path = getContainerFullPath().append(getFileName()); return validateFullResourcePath(path); } private boolean validateContainer() { IPath path = getContainerFullPath(); if (path == null) { problemType = PROBLEM_CONTAINER_EMPTY; problemMessage = Messages.ResourceGroup_folderEmpty; return false; } IWorkspace workspace = ResourcesPlugin.getWorkspace(); String projectName = path.segment(0); if (projectName == null || !workspace.getRoot().getProject(projectName).exists()) { problemType = PROBLEM_PROJECT_DOES_NOT_EXIST; problemMessage = Messages.ResourceGroup_noProject; return false; } // path is invalid if any prefix is occupied by a file IWorkspaceRoot root = workspace.getRoot(); while (path.segmentCount() > 1) { if (root.getFile(path).exists()) { problemType = PROBLEM_PATH_OCCUPIED; problemMessage = NLS.bind(Messages.ResourceGroup_pathOccupied, path.makeRelative()); return false; } path = path.removeLastSegments(1); } return true; } private boolean validateResourceName() { String resourceName = getFileName(); if (resourceName.length() == 0) { problemType = PROBLEM_RESOURCE_EMPTY; problemMessage = NLS.bind(Messages.ResourceGroup_emptyName, Messages.WizardNewFileCreationPage_file); return false; } if (!Path.ROOT.isValidPath(resourceName)) { problemType = PROBLEM_NAME_INVALID; problemMessage = NLS.bind(Messages.ResourceGroup_invalidFilename, resourceName); return false; } return true; } private boolean validateFullResourcePath(IPath resourcePath) { IWorkspace workspace = ResourcesPlugin.getWorkspace(); IStatus result = workspace.validatePath(resourcePath.toString(), IResource.FOLDER); if (!result.isOK()) { problemType = PROBLEM_PATH_INVALID; problemMessage = result.getMessage(); return false; } if (!allowExistingResources && isFileExists(resourcePath)) { problemType = PROBLEM_RESOURCE_EXIST; problemMessage = Messages.ResourceGroup_nameExists; return false; } return true; } String getProblemMessage() { return problemMessage; } int getProblemType() { return problemType; } } }