[yocto] [PATCH] [eclipse-poky][master]Add more comprehensive error message for invalid project name

Timo Müller mail at timomueller.eu
Thu Mar 14 03:29:33 PDT 2013


Hi Ioana,

Ioana Grigoropol wrote, On 14.03.2013 10:06:
> [Yocto #4008]
>
> Signed-off-by: Ioana Grigoropol <ioanax.grigoropol at intel.com>
> ---
>   .../sdk/ide/wizard/NewYoctoCProjectTemplate.java   |   34 +++++++++++++++++---
>   1 file changed, 29 insertions(+), 5 deletions(-)
>
> diff --git a/plugins/org.yocto.sdk.ide/src/org/yocto/sdk/ide/wizard/NewYoctoCProjectTemplate.java b/plugins/org.yocto.sdk.ide/src/org/yocto/sdk/ide/wizard/NewYoctoCProjectTemplate.java
> index 5ffd6b7..8ab5972 100644
> --- a/plugins/org.yocto.sdk.ide/src/org/yocto/sdk/ide/wizard/NewYoctoCProjectTemplate.java
> +++ b/plugins/org.yocto.sdk.ide/src/org/yocto/sdk/ide/wizard/NewYoctoCProjectTemplate.java
> @@ -10,6 +10,8 @@
>    *******************************************************************************/
>   package org.yocto.sdk.ide.wizard;
>
> +import java.util.ArrayList;
> +import java.util.Arrays;
>   import java.util.LinkedHashMap;
>   import java.util.List;
>
> @@ -46,11 +48,11 @@ import org.yocto.sdk.ide.YoctoProfileElement;
>   import org.yocto.sdk.ide.YoctoSDKChecker;
>   import org.yocto.sdk.ide.YoctoSDKChecker.SDKCheckRequestFrom;
>   import org.yocto.sdk.ide.YoctoSDKChecker.SDKCheckResults;
> +import org.yocto.sdk.ide.YoctoSDKPlugin;
> +import org.yocto.sdk.ide.YoctoUIElement;
>   import org.yocto.sdk.ide.natures.YoctoSDKEmptyProjectNature;
>   import org.yocto.sdk.ide.natures.YoctoSDKProjectNature;
>   import org.yocto.sdk.ide.utils.YoctoSDKUtils;
> -import org.yocto.sdk.ide.YoctoSDKPlugin;
> -import org.yocto.sdk.ide.YoctoUIElement;
>
>
>   @SuppressWarnings("restriction")
> @@ -58,11 +60,20 @@ public class NewYoctoCProjectTemplate extends ProcessRunner {
>   	protected boolean savedAutoBuildingValue;
>   	protected ProjectCreatedActions pca;
>   	protected IManagedBuildInfo info;
> +	protected List<Character> illegalChars = Arrays.asList('$', '"','#','%','&','\'','(',')','*', '+', ',','.','/',':',';','<','=','>','?','@','[','\\',']','^','`','{','|','}','~');
>   	
>   	public NewYoctoCProjectTemplate() {
>   		pca = new ProjectCreatedActions();
>   	}
> -	
> +	private String printIllegalChars(){
> +		String print = "";
> +		for (int i = 0; i < illegalChars.size(); i++) {
> +			print += illegalChars.get(i);
> +			if (i != illegalChars.size() - 1)
> +				print += " ,";
> +		}
> +		return print;
> +	}

I think the contained "if" isn't really necessary. You can remove the 
last ", " afterwards. Then you can also use a for each loop to append 
the characters.

private String printIllegalChars(){
	String print = "";

	for (Character character : illegalChars) {
		print += character + ", ";
	}
		
	if (!illegalChars.isEmpty()) {
		print = print.substring(0, print.lastIndexOf(",") - 1);
	}
		
	return print;
}

>   	public void process(TemplateCore template, ProcessArgument[] args, String processId, IProgressMonitor monitor) throws ProcessFailureException {
>
>   		String projectName = args[0].getSimpleValue();
> @@ -74,9 +85,10 @@ public class NewYoctoCProjectTemplate extends ProcessRunner {
>   		boolean isEmptryProject = Boolean.valueOf(isEmptyProjetValue).booleanValue();
>   		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
>   		try {
> -			if (projectName.contains(" ")) {
> +			if (!isValidProjectName(projectName)) {
>   				project.delete(true, null);
> -				throw new ProcessFailureException(projectName + " contains space(s).  Project name can't contain space(s)");
> +				throw new ProcessFailureException("Project name " + "\""+ projectName +"\"" +" is invalid! " +
> +						"\nNone of these characters are accepted inside project names: whitespaces, " + printIllegalChars());

Would be nice if we can wrap this up with the YoctoSDKMessages to be 
able to internationalize the string later.

>   			}
>   			if (!project.exists()) {
>   				IWorkspace workspace = ResourcesPlugin.getWorkspace();
> @@ -166,6 +178,18 @@ public class NewYoctoCProjectTemplate extends ProcessRunner {
>   			throw new OperationCanceledException(Messages.getString("NewManagedProject.3") + e.getMessage());
>   		}
>   	}
> +	private boolean isValidProjectName(String projectName) {
> +		if (projectName.contains("\\s+"))
> +			return false;
> +
> +		char[] chars = projectName.toCharArray();
> +		if (!Character.isJavaIdentifierStart(chars[0]))
> +			return false;
> +		for (int i = 1; i < chars.length; i++)
> +			if (illegalChars.contains(chars[i]))
> +				return false;
> +		return true;
> +}

I think it would be better to use functionality from java.util.regex to 
do the name checking. The Pattern could be compiled once as a static 
member and we could than use the matcher to check whether the project 
name is fine.

Something like this:

private static Pattern pattern = Pattern.compile(".*(\\$|\").*");

private boolean isValidProjectName(String projectName) {
   Matcher matcher = pattern.matcher(projectName);
	
   if (matcher.matches()) {
     return false;
   }

   return true;
}

>
>   	protected final void turnOffAutoBuild(IWorkspace workspace) throws CoreException {
>   		IWorkspaceDescription workspaceDesc = workspace.getDescription();
>

Best regards,
Timo




More information about the yocto mailing list