blob: 68f3e189398f579845e47564b236567e080dd986 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2006 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.project.facet;
import java.util.Set;
import org.eclipse.core.internal.resources.ResourceStatus;
import org.eclipse.core.internal.utils.Messages;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceStatus;
import org.eclipse.core.resources.IWorkspace;
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.osgi.util.NLS;
import org.eclipse.wst.common.componentcore.datamodel.FacetInstallDataModelProvider;
import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonMessages;
import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
import org.eclipse.wst.web.internal.ResourceHandler;
import com.ibm.icu.util.StringTokenizer;
public class SimpleWebFacetInstallDataModelProvider extends FacetInstallDataModelProvider implements ISimpleWebFacetInstallDataModelProperties {
public SimpleWebFacetInstallDataModelProvider() {
super();
}
@Override
public Set getPropertyNames() {
Set names = super.getPropertyNames();
names.add(CONTENT_DIR);
names.add(CONTEXT_ROOT);
return names;
}
@Override
public Object getDefaultProperty(String propertyName) {
if (propertyName.equals(CONTENT_DIR)) {
return "WebContent"; //$NON-NLS-1$
} else if (propertyName.equals(CONTEXT_ROOT)) {
return getProperty(FACET_PROJECT_NAME);
} else if (propertyName.equals(FACET_ID)) {
return IModuleConstants.WST_WEB_MODULE;
}
return super.getDefaultProperty(propertyName);
}
@Override
public boolean propertySet(String propertyName, Object propertyValue) {
if (FACET_PROJECT_NAME.equals(propertyName)) {
model.notifyPropertyChange(CONTEXT_ROOT, IDataModel.VALID_VALUES_CHG);
}
return super.propertySet(propertyName, propertyValue);
}
@Override
public IStatus validate(String name) {
if (name.equals(CONTEXT_ROOT)) {
return validateContextRoot(getStringProperty(CONTEXT_ROOT));
}
else if (name.equals(CONTENT_DIR)) {
String folderName = model.getStringProperty(CONTENT_DIR);
if (folderName == null || folderName.length() == 0 || folderName.equals("/") || folderName.equals("\\")) { //$NON-NLS-1$ //$NON-NLS-2$
// all folders which meet the criteria of "CONFIG_FOLDER" are required
String errorMessage = WTPCommonPlugin.getResourceString(WTPCommonMessages.WEBCONTENTFOLDER_EMPTY);
return WTPCommonPlugin.createErrorStatus(errorMessage);
}
IStatus status = validateFolderName(folderName);
if (status.isOK())
{
if (folderName.indexOf('#') != -1) {
String message = NLS.bind(Messages.resources_invalidCharInName, "#", folderName); //$NON-NLS-1$
status = new ResourceStatus(IResourceStatus.INVALID_VALUE, null, message);
}
}
return status;
}
return super.validate(name);
}
protected IStatus validateContextRoot(String contextRoot) {
if (contextRoot == null || contextRoot.length() == 0) {
return new ResourceStatus(IResourceStatus.INVALID_VALUE, null, ResourceHandler.Context_Root_cannot_be_empty_2);
} else if (contextRoot.trim().equals(contextRoot)) {
StringTokenizer stok = new StringTokenizer(contextRoot, "."); //$NON-NLS-1$
while (stok.hasMoreTokens()) {
String token = stok.nextToken();
for (int i = 0; i < token.length(); i++) {
if(token.charAt(i) == ' ')
{
return new ResourceStatus(IResourceStatus.INVALID_VALUE, null, ResourceHandler.Names_cannot_contain_whitespace);
}
else if (!(token.charAt(i) == '_') && !(token.charAt(i) == '-') && !(token.charAt(i) == '/') && Character.isLetterOrDigit(token.charAt(i)) == false) {
Object[] invalidChar = new Object[]{(new Character(token.charAt(i))).toString()};
String errorStatus = ResourceHandler.getString(ResourceHandler.The_character_is_invalid_in_a_context_root, invalidChar);
return new ResourceStatus(IResourceStatus.INVALID_VALUE, null, errorStatus);
}
}
}
} else
{
return new ResourceStatus(IResourceStatus.INVALID_VALUE, null, ResourceHandler.Names_cannot_contain_whitespace);
}
return OK_STATUS;
}
protected IStatus validateFolderName(String folderName) {
// the directory is not required, but if the name is entered ensure that it
// contains only valid characters.
if (folderName == null || folderName.length() == 0) {
return OK_STATUS;
}
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IPath path = new Path(folderName);
for (int i = 0, max = path.segmentCount(); i < max; i++) {
IStatus status = workspace.validateName(path.segment(i), IResource.FOLDER);
if (! status.isOK())
return status;
}
// all of the potential segments of the folder have been verified
return OK_STATUS;
}
}