/*******************************************************************************
* Copyright (c) 2007 - 2012 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.files.handlers;
import java.text.MessageFormat;
import java.util.Properties;
import java.util.StringTokenizer;
import org.eclipse.core.resources.IResource;
import org.jboss.tools.common.meta.action.XEntityData;
import org.jboss.tools.common.meta.action.impl.DefaultWizardDataValidator;
import org.jboss.tools.common.meta.action.impl.SpecialWizardSupport;
import org.jboss.tools.common.meta.action.impl.WizardDataValidator;
import org.jboss.tools.common.meta.action.impl.handlers.DefaultCreateHandler;
import org.jboss.tools.common.meta.impl.XMetaDataConstants;
import org.jboss.tools.common.model.ServiceDialog;
import org.jboss.tools.common.model.XModelException;
import org.jboss.tools.common.model.XModelObjectConstants;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.filesystems.impl.CreateFileHandler;
import org.jboss.tools.common.model.filesystems.impl.FolderImpl;
import org.jboss.tools.common.model.plugin.ModelMessages;
public class CreateFolderSupport extends SpecialWizardSupport {
protected TargetHolder targetHolder = new TargetHolder();
public CreateFolderSupport() {}
public void reset() {
targetHolder.setAction(action);
targetHolder.target = getTarget();
IResource r = (IResource)getTarget().getAdapter(IResource.class);
if(r == null) {
setAttributeValue(0, "folder", ""); //$NON-NLS-1$ //$NON-NLS-2$
targetHolder.revalidate(null);
} else {
targetHolder.revalidate(r.getFullPath().toString());
setAttributeValue(0, "folder", "" + targetHolder.path); //$NON-NLS-1$ //$NON-NLS-2$
}
}
@Override
public void action(String name) throws XModelException {
if(FINISH.equals(name)) {
if(!checkResource()) return;
execute();
setFinished(true);
} else if(CANCEL.equals(name)) {
setFinished(true);
} else if(HELP.equals(name)) {
help();
}
}
public String[] getActionNames(int stepId) {
return new String[]{FINISH, CANCEL, HELP};
}
protected boolean checkResource() {
if(targetHolder.addPath.length() == 0) return true;
ServiceDialog d = getTarget().getModel().getService();
String message = MessageFormat.format(
"Folder {0} does not exist. Do you want to create it?",
targetHolder.path);
int q = d.showDialog(ModelMessages.WARNING, message, new String[]{SpecialWizardSupport.OK, SpecialWizardSupport.CANCEL}, null, ServiceDialog.QUESTION);
return q == 0;
}
public boolean canCreateResource(String path) {
if(targetHolder.target == null) return false;
if(path == null || path.length() == 0 || path.indexOf('*') >= 0) return false;
return isCorrectPath(path) && !resourceExists(path);
}
boolean isCorrectPath(String path) {
path = revalidatePath(path);
if(path == null || path.equals(XModelObjectConstants.SEPARATOR) || path.indexOf("//") >= 0) return false; //$NON-NLS-1$
return true;
}
boolean resourceExists(String path) {
if(path == null || targetHolder.target == null) return false;
path = revalidatePath(path);
if(path.startsWith(XModelObjectConstants.SEPARATOR)) path = path.substring(1);
return targetHolder.target.getChildByPath(path) != null;
}
protected String revalidatePath(String path) {
if(path == null || path.length() == 0) return path;
if(!path.startsWith(XModelObjectConstants.SEPARATOR)) path = XModelObjectConstants.SEPARATOR + path;
if(targetHolder.addPath.length() > 0) {
path = targetHolder.addPath + path;
}
return path;
}
protected void execute() throws XModelException {
Properties p = extractStepData(0);
String path = p.getProperty(XModelObjectConstants.ATTR_NAME);
path = revalidatePath(path);
XModelObject f = createFolder(path);
if(f != null) targetHolder.saveLastPath();
}
protected XModelObject createFolder(String path) throws XModelException {
if(!canCreateResource(path)) return null;
XModelObject fs = targetHolder.target;
StringTokenizer st = new StringTokenizer(path, XModelObjectConstants.SEPARATOR);
int c = st.countTokens(), i = 0;
while(i < c) {
String s = st.nextToken();
XModelObject o = fs.getChildByPath(s);
if(o == null) {
o = fs.getModel().createModelObject("FileFolder", null); //$NON-NLS-1$
o.setAttributeValue(XModelObjectConstants.ATTR_NAME, s);
DefaultCreateHandler.addCreatedObject(fs, o, getProperties());
((FolderImpl)o).save();
}
fs = o;
i++;
}
return fs;
}
protected final XModelObject getTargetFolder() {
return targetHolder.target;
}
protected DefaultWizardDataValidator validator = createValidator();
public WizardDataValidator getValidator(int step) {
validator.setSupport(this, step);
return validator;
}
protected DefaultWizardDataValidator createValidator() {
return new Validator();
}
protected class Validator extends DefaultWizardDataValidator {
public void validate(Properties data) {
String folder = data.getProperty("folder"); //$NON-NLS-1$
targetHolder.revalidate(folder);
message = null;
if(targetHolder.target == null) {
message = "Cannot create folder in specified folder.";
return;
}
validateFolderName();
if(message != null) return;
validateChildName(data);
if(message != null) return;
super.validate(data);
}
String FORBIDDEN_INDICES = "\"\n\t*\\/:<>?|"; //$NON-NLS-1$
protected void validateChildName(Properties data) {
if(message != null) return;
String name = data.getProperty(XModelObjectConstants.ATTR_NAME);
if(name == null || name.length() == 0) return;
if(name.equals(".")) { //$NON-NLS-1$
message = "Incorrect name.";
} else if(name.endsWith(".") && name.indexOf('.') != name.lastIndexOf('.')) { //$NON-NLS-1$
message = "Name must not end in a period.";
} else {
for (int i = 0; i < FORBIDDEN_INDICES.length(); i++) {
if(name.indexOf(FORBIDDEN_INDICES.charAt(i)) >= 0) {
message = MessageFormat.format(
"Name must not contain character {0} .",
FORBIDDEN_INDICES.charAt(i));
return;
}
}
}
}
String FORBIDDEN_FOLDER_LETTERS = "\"\n\t*:<>?|"; //$NON-NLS-1$
private void validateFolderName() {
if(targetHolder.addPath.length() == 0) return;
for (int i = 0; i < FORBIDDEN_FOLDER_LETTERS.length(); i++) {
if(targetHolder.addPath.indexOf(FORBIDDEN_FOLDER_LETTERS.charAt(i)) >= 0) {
message = MessageFormat.format(
"Folder name must not contain character {0} .",
FORBIDDEN_FOLDER_LETTERS.charAt(i));
return;
}
}
}
protected void validateAddFile(XEntityData[] ds, Properties data) {
CreateFileHandler.validateNameAndExtension(action, data, null);
if(targetHolder.target != null) {
String entity = action.getProperty(XMetaDataConstants.ENTITY);
if(entity == null) entity = getEntityData()[step].getModelEntity().getName();
if(targetHolder.addPath == null || targetHolder.addPath.length() == 0) {
if(!checkChild(targetHolder.target, entity, data)) return;
}
} else {
message = "Cannot create file in specified folder.";
}
}
}
public String getFocusAttribute(int stepId) {
if(stepId == 0) {
return XModelObjectConstants.ATTR_NAME;
}
return super.getFocusAttribute(stepId);
}
}