[yocto] [PATCH 3/3] Validate project name and location for Bitbake command project

Ioana Grigoropol ioanax.grigoropol at intel.com
Tue Dec 4 05:26:23 PST 2012


- if the project location is empty default value will be used (e.g. /home/user/)
- project name must not contain whitespaces and/or invalid characters
- if we choose to clone a new repo but the destination directory already contains a .git directory, do not allow moving forward
- if we choose to validate an existing repository, make sure that the directory exists, and contains a .git directory as well as a oe-init-build-env script

Signed-off-by: Ioana Grigoropol <ioanax.grigoropol at intel.com>
---
 .../src/org/yocto/bc/bitbake/ShellSession.java     |   94 +++--------
 .../org/yocto/bc/remote/utils/RemoteHelper.java    |   69 ++++----
 .../remote/utils/YoctoHostShellProcessAdapter.java |   15 +-
 .../yocto/bc/ui/wizards/install/OptionsPage.java   |  178 ++++++++++----------
 .../BBConfigurationInitializeOperation.java        |    6 +-
 .../newproject/CreateBBCProjectOperation.java      |   24 ++-
 6 files changed, 173 insertions(+), 213 deletions(-)

diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/ShellSession.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/ShellSession.java
index 961472f..f143bed 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/ShellSession.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/ShellSession.java
@@ -48,23 +48,23 @@ public class ShellSession {
 	public static final String LT = System.getProperty("line.separator");
 	public static final String exportCmd = "export BB_ENV_EXTRAWHITE=\"DISABLE_SANITY_CHECKS $BB_ENV_EXTRAWHITE\"";
 	public static final String exportColumnsCmd = "export COLUMNS=1000";
-	
+
 	public static String getFilePath(String file) throws IOException {
 		File f = new File(file);
-		
+
 		if (!f.exists() || f.isDirectory()) {
 			throw new IOException("Path passed is not a file: " + file);
 		}
-		
+
 		StringBuffer sb = new StringBuffer();
-		
+
 		String elems[] = file.split("//");
-		
+
 		for (int i = 0; i < elems.length - 1; ++i) {
 			sb.append(elems[i]);
 			sb.append("//");
 		}
-		
+
 		return sb.toString();
 	}
 	private Process process;
@@ -90,7 +90,7 @@ public class ShellSession {
 //			shellPath = "/bin/sh";
 //		}
 //		shellPath  = "/bin/bash";
-		
+
 		initializeShell(new NullProgressMonitor());
 	}
 
@@ -104,13 +104,14 @@ public class ShellSession {
 		}
 	}
 
-	synchronized 
+	synchronized
 	public String execute(String command) throws IOException {
 		return execute(command, false);
 	}
 
-	synchronized 
+	synchronized
 	public String execute(String command, boolean hasErrors) throws IOException {
+
 		try {
 			IHost connection = RemoteHelper.getRemoteConnectionByName(projectInfo.getConnection().getName());
 			hasErrors = RemoteHelper.runCommandRemote(connection, new YoctoCommand(command, root.getAbsolutePath() + "/build/", ""));
@@ -119,57 +120,15 @@ public class ShellSession {
 			e.printStackTrace();
 		}
 		return null;
-//		sendToProcessAndTerminate(command);
-//
-//		if (process.getErrorStream().available() > 0) {
-//			byte[] msg = new byte[process.getErrorStream().available()];
-//
-//			process.getErrorStream().read(msg, 0, msg.length);
-//			out.write(new String(msg));
-//			out.write(LT);
-//			errorMessage = "Error while executing: " + command + LT + new String(msg);
-//		}
-//		
-//		BufferedReader br = new BufferedReader(new InputStreamReader(process
-//				.getInputStream()));
-//
-//		StringBuffer sb = new StringBuffer();
-//		String line = null;
-
-//		while (((line = br.readLine()) != null) && !line.endsWith(TERMINATOR) && !interrupt) {
-//			sb.append(line);
-//			sb.append(LT);
-//			out.write(line);
-//			out.write(LT);
-//		}
-//		
-//		if (interrupt) {
-//			process.destroy();
-//			initializeShell(null);
-//			interrupt = false;
-//		} 
-//		else if (line != null && retCode != null) {
-//			try {
-//				retCode[0]=Integer.parseInt(line.substring(0,line.lastIndexOf(TERMINATOR)));
-//			}catch (NumberFormatException e) {
-//				throw new IOException("Can NOT get return code" + command + LT + line);
-//			}
-//		}
-//		
-//		if (errorMessage != null) {
-//			throw new IOException(errorMessage);
-//		}
-//
-//		return sb.toString();
 	}
 
-synchronized 
+synchronized
 	public void execute(String command, ICommandResponseHandler handler) throws IOException {
 		System.out.println(command);
 		execute(command, TERMINATOR, handler);
 	}
-	
-	synchronized 
+
+	synchronized
 	public void execute(String command, String terminator, ICommandResponseHandler handler) throws IOException {
 		interrupt = false;
 		InputStream errIs = process.getErrorStream();
@@ -177,40 +136,40 @@ synchronized
 			clearErrorStream(errIs);
 		}
 		sendToProcessAndTerminate(command);
-		
+
 		BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
 		String std = null;
 
-		do {		
+		do {
 			if (errIs.available() > 0) {
 				byte[] msg = new byte[errIs.available()];
 
 				errIs.read(msg, 0, msg.length);
 //				out.write(new String(msg));
 				handler.response(new String(msg), true);
-			} 
-			
+			}
+
 			std = br.readLine();
-			
+
 			if (std != null && !std.endsWith(terminator)) {
 //				out.write(std);
 				handler.response(std, false);
-			} 
-			
+			}
+
 		} while (std != null && !std.endsWith(terminator) && !interrupt);
-		
+
 		if (interrupt) {
 			process.destroy();
 			initializeShell(null);
 			interrupt = false;
 		}
 	}
-	
+
 	private void clearErrorStream(InputStream is) {
-	
+
 		try {
 			byte b[] = new byte[is.available()];
-			is.read(b);			
+			is.read(b);
 			System.out.println("clearing: " + new String(b));
 		} catch (IOException e) {
 			e.printStackTrace();
@@ -221,7 +180,7 @@ synchronized
 	/**
 	 * Send command string to shell process and add special terminator string so
 	 * reader knows when output is complete.
-	 * 
+	 *
 	 * @param command
 	 * @throws IOException
 	 */
@@ -241,6 +200,5 @@ synchronized
 	public void interrupt() {
 		interrupt = true;
 	}
-	
-}
 
+}
\ No newline at end of file
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteHelper.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteHelper.java
index 929ad63..f375de1 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteHelper.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteHelper.java
@@ -47,13 +47,13 @@ import org.yocto.bc.ui.wizards.install.Messages;
 public class RemoteHelper {
 	public static final int TOTALWORKLOAD = 100;
 	private static Map<IHost, RemoteMachine> machines;
-	
+
 	public static RemoteMachine getRemoteMachine(IHost connection){
 		if (!getMachines().containsKey(connection))
 			getMachines().put(connection, new RemoteMachine(connection));
 		return getMachines().get(connection);
 	}
-	
+
 	private static Map<IHost, RemoteMachine> getMachines() {
 		if (machines == null)
 			machines = new HashMap<IHost, RemoteMachine>();
@@ -71,7 +71,7 @@ public class RemoteHelper {
 	public static YoctoHostShellProcessAdapter getHostShellProcessAdapter(IHost connection) {
 		return getRemoteMachine(connection).getHostShellProcessAdapter();
 	}
-	
+
 	public static ProcessStreamBuffer getProcessBuffer(IHost connection) {
 		return getRemoteMachine(connection).getProcessBuffer();
 	}
@@ -87,20 +87,20 @@ public class RemoteHelper {
 		for (int i = 0; i < connections.length; i++)
 			if (connections[i].getAliasName().equals(remoteConnection))
 				return connections[i];
-		return null; 
+		return null;
 	}
-	
+
 	public static IHost getRemoteConnectionForURI(URI uri, IProgressMonitor monitor) {
 		if (uri == null)
 			return null;
-		
+
 		String host = uri.getHost();
-		if (host == null) 
+		if (host == null)
 			return null;
-		
+
 		ISystemRegistry sr = RSECorePlugin.getTheSystemRegistry();
 		IHost[] connections = sr.getHosts();
-		 
+
 		IHost unconnected = null;
 		for (IHost conn : connections) {
 			if (host.equalsIgnoreCase(conn.getHostName())) {
@@ -110,26 +110,26 @@ public class RemoteHelper {
 				unconnected = conn;
 			}
 		}
-		 
+
 		return unconnected;
 	}
-		 
+
 	public static IRemoteFileSubSystem getRemoteFileSubSystem(IHost host) {
 		IRemoteFileSubSystem candidate = null;
 		IRemoteFileSubSystem otherServiceCandidate = null;
 		IRemoteFileSubSystem[] subSystems = RemoteFileUtility.getFileSubSystems(host);
-		
+
 		for (IRemoteFileSubSystem subSystem : subSystems) {
 			if (subSystem instanceof FileServiceSubSystem) {
 				if (subSystem.isConnected())
 					return subSystem;
-				
+
 				if (otherServiceCandidate == null)
 					otherServiceCandidate = subSystem;
-				
+
 			} else if (candidate == null || (subSystem.isConnected() && !candidate.isConnected()))
 				candidate = subSystem;
-		
+
 		}
 		if (candidate != null && candidate.isConnected())
 			return candidate;
@@ -137,7 +137,7 @@ public class RemoteHelper {
 			return otherServiceCandidate;
 		return null;
 	}
-	
+
 	public static String getRemoteHostName(String remoteConnection){
 		final IHost host = getRemoteConnectionByName(remoteConnection);
 		if(host == null)
@@ -149,9 +149,9 @@ public class RemoteHelper {
 	public static IFileService getConnectedRemoteFileService(IHost connection, IProgressMonitor monitor) throws Exception {
 		return getRemoteMachine(connection).getRemoteFileService(monitor);
 	}
-	
+
 	public static IHostFile[] getRemoteDirContent(IHost connection, String remoteParent, String fileFilter, int fileType, IProgressMonitor monitor){
-		
+
 		try {
 			IFileService fileServ = getConnectedRemoteFileService(connection, monitor);
 			return fileServ.list(remoteParent, fileFilter, fileType, monitor);
@@ -182,11 +182,11 @@ public class RemoteHelper {
 
 		return ((IFileServiceSubSystem) subsystem).getFileService();
 	}
-	
+
 	public static ISubSystem getFileSubsystem(IHost connection) {
 		return getRemoteMachine(connection).getFileSubsystem();
 	}
-	
+
 	public static IService getConnectedShellService(IHost connection, IProgressMonitor monitor) throws Exception {
 		return getRemoteMachine(connection).getShellService(monitor);
 	}
@@ -201,21 +201,21 @@ public class RemoteHelper {
 		}
 		return null;
 	}
-	
+
 	public static void getRemoteFile(IHost connection, String localExePath, String remoteExePath,
 			IProgressMonitor monitor) throws Exception {
-		
+
 		assert(connection!=null);
 		monitor.beginTask(Messages.InfoDownload, 100);
-		
+
 		IFileService fileService;
 		try {
-			fileService = (IFileService) getConnectedRemoteFileService(connection, new SubProgressMonitor(monitor, 10));
+			fileService = getConnectedRemoteFileService(connection, new SubProgressMonitor(monitor, 10));
 			File file = new File(localExePath);
 			file.deleteOnExit();
 			monitor.worked(5);
 			Path remotePath = new Path(remoteExePath);
-			fileService.download(remotePath.removeLastSegments(1).toString(), 
+			fileService.download(remotePath.removeLastSegments(1).toString(),
 					remotePath.lastSegment(),file,true, null,
 					new SubProgressMonitor(monitor, 85));
 		} finally {
@@ -223,13 +223,13 @@ public class RemoteHelper {
 		}
 		return;
 	}
-	
+
 	public static IHostFile getRemoteHostFile(IHost connection, String remoteFilePath, IProgressMonitor monitor){
 		assert(connection != null);
 		monitor.beginTask(Messages.InfoDownload, 100);
-		
+
 		try {
-			IFileService fileService = (IFileService) getConnectedRemoteFileService(connection, new SubProgressMonitor(monitor, 10));
+			IFileService fileService = getConnectedRemoteFileService(connection, new SubProgressMonitor(monitor, 10));
 			Path remotePath = new Path(remoteFilePath);
 			IHostFile remoteFile = fileService.getFile(remotePath.removeLastSegments(1).toString(), remotePath.lastSegment(), new SubProgressMonitor(monitor, 5));
 			return remoteFile;
@@ -239,20 +239,20 @@ public class RemoteHelper {
 		}
 		return null;
 	}
-	
+
 	public static boolean runCommandRemote(final IHost connection, final YoctoCommand cmd) throws Exception {
 		final String remoteCommand = cmd.getCommand() + " " + cmd.getArguments();
 		final boolean hasErrors = false;
-		
+
 		if (!cmd.getInitialDirectory().isEmpty()) {
 			writeToShell(connection, "cd " + cmd.getInitialDirectory());
 		}
 		if (!hasErrors)
 			writeToShell(connection, remoteCommand);
-				
+
 		return hasErrors;
 	}
-	
+
 	public static boolean writeToShell(final IHost connection, final String remoteCommand){
 		new Thread(new Runnable() {
 			@Override
@@ -282,7 +282,7 @@ public class RemoteHelper {
 				}
 				writeToShell(connection, remoteCommand);
 			}
-			
+
 		} catch (Exception e1) {
 			e1.printStackTrace();
 		}
@@ -291,7 +291,7 @@ public class RemoteHelper {
 	/**
 	 * Throws a core exception with an error status object built from the given
 	 * message, lower level exception, and error code.
-	 * 
+	 *
 	 * @param message
 	 *            the status message
 	 * @param exception
@@ -329,6 +329,7 @@ public class RemoteHelper {
 			String parentPath = path.substring(0, nameStart);
 			String name = path.substring(nameStart + 1);
 			IHostFile hostFile = fs.getFile(parentPath, name, monitor);
+
 			return hostFile.exists();
 		} catch (Exception e) {
 			e.printStackTrace();
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/YoctoHostShellProcessAdapter.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/YoctoHostShellProcessAdapter.java
index baedc3b..9ab43cf 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/YoctoHostShellProcessAdapter.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/YoctoHostShellProcessAdapter.java
@@ -33,7 +33,7 @@ public class YoctoHostShellProcessAdapter extends  HostShellProcessAdapter {
 	private String endChar = null;
 
 	private Semaphore sem;
-	
+
 	public YoctoHostShellProcessAdapter(IHostShell hostShell, ProcessStreamBuffer processStreamBuffer, CommandResponseHandler commandResponseHandler) throws IOException {
 		super(hostShell);
 		this.processStreamBuffer = processStreamBuffer;
@@ -67,11 +67,11 @@ public class YoctoHostShellProcessAdapter extends  HostShellProcessAdapter {
 	private interface ICalculatePercentage {
 		public float calWorkloadDone(String info) throws IllegalArgumentException;
 	}
-	
+
 	private class GitCalculatePercentage implements ICalculatePercentage {
 		final Pattern pattern = Pattern.compile("^Receiving objects:\\s*(\\d+)%.*");
 		public float calWorkloadDone(String info) throws IllegalArgumentException {
-	Matcher m = pattern.matcher(info.trim());
+			Matcher m = pattern.matcher(info.trim());
 			if(m.matches()) {
 				return new Float(m.group(1)) / 100;
 			}else {
@@ -79,7 +79,7 @@ public class YoctoHostShellProcessAdapter extends  HostShellProcessAdapter {
 			}
 		}
 	}
-	
+
 	private IProgressMonitor getMonitor() {
 		if (command == null) {
 			return null;
@@ -88,16 +88,13 @@ public class YoctoHostShellProcessAdapter extends  HostShellProcessAdapter {
 	}
 
 	private void updateMonitor(final int work){
-	
 		Display.getDefault().asyncExec(new Runnable() {
-
 			@Override
 			public void run() {
 				if (getMonitor() != null) {
 					getMonitor().worked(work);
 				}
 			}
-
 		});
 	}
 
@@ -155,10 +152,9 @@ public class YoctoHostShellProcessAdapter extends  HostShellProcessAdapter {
 					continue;
 				}
 				setCommandPrompt(value);
-	
 				if (commandPrompt != null && endChar != null && command != null && processStreamBuffer != null &&
 						value.startsWith(commandPrompt) &&  value.endsWith(endChar) && 
-						!value.endsWith(command) && processStreamBuffer.getLastOutputLineContaining(command) != null) {
+						!value.endsWith(command) && processStreamBuffer.getLastOutputLineContaining(command) != null /*&& waitForOutput*/) {
 					sem.release();
 					isFinished = true;
 				}
@@ -210,4 +206,3 @@ public class YoctoHostShellProcessAdapter extends  HostShellProcessAdapter {
 	}
 
 }
-
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/install/OptionsPage.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/install/OptionsPage.java
index 7c1a655..37c12f8 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/install/OptionsPage.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/install/OptionsPage.java
@@ -1,7 +1,6 @@
 package org.yocto.bc.ui.wizards.install;
 
 import java.io.File;
-import java.io.FilenameFilter;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Map;
@@ -13,6 +12,7 @@ import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IWorkspaceRoot;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.ptp.rdt.ui.wizards.RemoteProjectContentsLocationArea;
@@ -22,9 +22,9 @@ import org.eclipse.ptp.remote.core.IRemoteFileManager;
 import org.eclipse.ptp.remote.core.IRemoteServices;
 import org.eclipse.ptp.remote.core.exception.RemoteConnectionException;
 import org.eclipse.ptp.remote.rse.core.RSEConnection;
+import org.eclipse.rse.core.model.IHost;
+import org.eclipse.rse.services.files.IHostFile;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
@@ -32,31 +32,32 @@ import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Group;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
+import org.yocto.bc.remote.utils.RemoteHelper;
 import org.yocto.bc.ui.wizards.FiniteStateWizardPage;
 
 /**
  * Select which flavor of OE is to be installed.
- * 
+ *
  * @author kgilmer
- * 
+ *
  * Setting up the parameters for creating the new Yocto Bitbake project
- * 
+ *
  * @modified jzhang
  */
 public class OptionsPage extends FiniteStateWizardPage {
 
 	public static final String URI_SEPARATOR = "/";
 	public static final String LOCALHOST = "LOCALHOST";
-	
+
 	private Composite top;
-	
+
 	private ValidationListener validationListener;
 	private Text txtProjectName;
 	private Button btnGit;
 	private Button btnValidate;
-	
+
 	private RemoteProjectContentsLocationArea locationArea;
-	
+
 	protected OptionsPage(Map<String, Object> model) {
 		super("Options", model);
 		setMessage("Enter these parameters to create new Yocto Project BitBake commander project");
@@ -69,7 +70,7 @@ public class OptionsPage extends FiniteStateWizardPage {
 		top.setLayoutData(new GridData(GridData.FILL_BOTH));
 
 		GridData gdFillH = new GridData(GridData.FILL_HORIZONTAL);
-		
+
 		Composite projectNameComp = new Composite(top, SWT.NONE);
 		GridData gdProjName = new GridData(GridData.FILL_HORIZONTAL);
 		projectNameComp.setLayoutData(gdProjName);
@@ -81,11 +82,11 @@ public class OptionsPage extends FiniteStateWizardPage {
 		txtProjectName.setLayoutData(gdFillH);
 		txtProjectName.setFocus();
 		validationListener = new ValidationListener();
-		
+
 		txtProjectName.addModifyListener(validationListener);
 
 		IErrorMessageReporter errorReporter = new IErrorMessageReporter() {
-			
+
 			@Override
 			public void reportError(String errorMessage, boolean infoOnly) {
 				setMessage(errorMessage);
@@ -93,47 +94,32 @@ public class OptionsPage extends FiniteStateWizardPage {
 				updateModel();
 			}
 		};
-		
+
 		locationArea = new RemoteProjectContentsLocationArea(errorReporter, top, null);
-		
+
 		Group locationValidationGroup = new Group(top, SWT.NONE);
 		locationValidationGroup.setText("Git repository");
 		GridData gd = new GridData(GridData.VERTICAL_ALIGN_END | GridData.FILL_HORIZONTAL);
 		locationValidationGroup.setLayoutData(gd);
 		GridLayout gl = new GridLayout(1, false);
 		locationValidationGroup.setLayout(gl);
-		
-		SelectionListener lst = new SelectionListener() {
-			
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				if (validateProjectName() && validateProjectLocation()) 
-					setPageComplete(true);
-				
-			}
-			
-			@Override
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		};
-		
-		
+
 		btnGit = new Button(locationValidationGroup, SWT.RADIO);
 		btnGit.setText("Clone from Yocto Project &Git Repository into new location");
 		btnGit.setEnabled(true);
 		btnGit.setSelection(true);
-		btnGit.addSelectionListener(lst);
-		
-		
+		btnGit.addSelectionListener(validationListener);
+
+
 		btnValidate = new Button(locationValidationGroup, SWT.RADIO);
 		btnValidate.setText("&Validate existing Git project location");
 		btnValidate.setEnabled(true);
 		btnValidate.setSelection(false);
-		btnValidate.addSelectionListener(lst);
-		
+		btnValidate.addSelectionListener(validationListener);
+
 		setControl(top);
 	}
-	
+
 	private boolean validateProjectName() {
 		IWorkspaceRoot wsroot = ResourcesPlugin.getWorkspace().getRoot();
 
@@ -143,7 +129,7 @@ public class OptionsPage extends FiniteStateWizardPage {
 			setErrorMessage("Project name cannot be empty!");
 			return false;
 		}
-		
+
 		if (!validate.isOK() || !isValidProjectName(txtProjectName.getText())) {
 			setErrorMessage("Invalid project name: " + txtProjectName.getText());
 			return false;
@@ -156,67 +142,78 @@ public class OptionsPage extends FiniteStateWizardPage {
 		}
 		return true;
 	}
-	
+
 	public String getProjectName(){
 		return txtProjectName.getText().trim();
 	}
-	
+
 	protected boolean validateProjectLocation() {
-		
+
 		String projectLoc = locationArea.getProjectLocation().trim();
-		
-		File checkProject_dir = new File(projectLoc);
-		if (!checkProject_dir.isDirectory()) {
-			setErrorMessage("The project location directory " + projectLoc + " is not valid");
+
+		IRemoteConnection remoteConnection = locationArea.getRemoteConnection();
+		if (remoteConnection == null)
 			return false;
-		}
+
+		if (projectLoc.isEmpty())
+			return true;
+
+		IHost connection = RemoteHelper.getRemoteConnectionByName(remoteConnection.getName());
+
 		projectLoc = convertToRealPath(projectLoc);
 		String separator = projectLoc.endsWith(URI_SEPARATOR) ? "" : URI_SEPARATOR;
 		String projectPath = projectLoc + separator + getProjectName();
-		File gitDir = new File(projectPath);
+		IHostFile repoDest = RemoteHelper.getRemoteHostFile(connection, projectPath, new NullProgressMonitor());
+
 		if(btnValidate.getSelection()) {
-			if(!gitDir.isDirectory() || !gitDir.exists()) {
+			if (repoDest == null || !repoDest.exists()) {
 				setErrorMessage("Directory " + projectPath + " does not exist, please select git clone.");
 				return false;
 			}
-			File[] filesMatched = gitDir.listFiles(new FilenameFilter() {
-				
-				@Override
-				public boolean accept(File file, String pattern) {
-					return file.getName().equals(".git");
-				}
-			});
-			
-			if (filesMatched.length != 1) {
+			IHostFile gitDescr = RemoteHelper.getRemoteHostFile(connection, projectPath + "/.git", new NullProgressMonitor());
+			if (gitDescr == null || !gitDescr.exists()) {
 				setErrorMessage("Directory " + projectPath + " does not contain a git repository, please select git clone.");
 				return false;
 			}
-			
-			if(!new File(projectLoc + separator + InstallWizard.VALIDATION_FILE).exists()) {
+
+			IHostFile validationFile = RemoteHelper.getRemoteHostFile(connection, projectPath + URI_SEPARATOR + InstallWizard.VALIDATION_FILE, new NullProgressMonitor());
+			if (validationFile == null || !validationFile.exists()) {
 				setErrorMessage("Directory " + projectPath + " seems invalid, please use other directory or project name.");
 				return false;
 			}
+		} else { //git clone
+			if (repoDest.exists() && repoDest.isDirectory()) {
+				IHostFile gitDescr = RemoteHelper.getRemoteHostFile(connection, projectPath + "/.git", new NullProgressMonitor());
+				if (gitDescr != null && gitDescr.exists()) {
+					setErrorMessage("Directory " + projectPath + " contains a repository, please select validate repository.");
+					return false;
+				}
+			}
 		}
-		
+
 		try {
-			IWorkspaceRoot wsroot = ResourcesPlugin.getWorkspace().getRoot();
-			IProject proj = wsroot.getProject(txtProjectName.getText());
-			if (proj.exists()) {
-				setErrorMessage("A project with the name " + txtProjectName.getText() + " already exists");
-				return false;
-			}
-			URI location = new URI("file:" + URI_SEPARATOR + URI_SEPARATOR + convertToRealPath(projectLoc) + URI_SEPARATOR + txtProjectName.getText());
-			
-			IStatus status = ResourcesPlugin.getWorkspace().validateProjectLocationURI(proj, location);
-			if (!status.isOK()) {
-				setErrorMessage(status.getMessage());
-				return false;
+			String projName = txtProjectName.getText();
+			if (!projName.trim().isEmpty() && validateProjectName()) {
+				IWorkspaceRoot wsroot = ResourcesPlugin.getWorkspace().getRoot();
+				IProject proj = wsroot.getProject();
+				if (proj != null && proj.exists()) {
+					setErrorMessage("A project with the name " + projName + " already exists");
+					return false;
+				}
+				URI location = new URI("file:" + URI_SEPARATOR + URI_SEPARATOR + convertToRealPath(projectLoc) + URI_SEPARATOR + txtProjectName.getText());
+
+				IStatus status = ResourcesPlugin.getWorkspace().validateProjectLocationURI(proj, location);
+				if (!status.isOK()) {
+					setErrorMessage(status.getMessage());
+					return false;
+				}
 			}
 		} catch (Exception e) {
+			e.printStackTrace();
 			setErrorMessage("Run into error while trying to validate entries!");
 			return false;
 		}
-		
+
 		setErrorMessage(null);
 		return true;
 	}
@@ -238,7 +235,7 @@ public class OptionsPage extends FiniteStateWizardPage {
 	    return convertedpath;
 	}
 
-	
+
 	@Override
 	public void pageCleanup() {
 
@@ -249,7 +246,7 @@ public class OptionsPage extends FiniteStateWizardPage {
 	}
 
 	@Override
-	
+
 	protected void updateModel() {
 		try {
 			URI uri = getProjectLocationURI();
@@ -266,12 +263,12 @@ public class OptionsPage extends FiniteStateWizardPage {
 
 	public URI getProjectLocationURI() throws URISyntaxException {
 		URI uri = locationArea.getProjectLocationURI();
-		
+
 		if (uri != null) {
 			String location = locationArea.getProjectLocation();
 			if (!uri.getPath().isEmpty()) {
 				String separator = uri.getPath().endsWith(URI_SEPARATOR) ? "" : URI_SEPARATOR;
-				
+
 				return new URI( uri.getScheme(),
 								uri.getHost(),
 								uri.getPath() + separator + txtProjectName.getText(),
@@ -284,7 +281,7 @@ public class OptionsPage extends FiniteStateWizardPage {
 		} else {
 			String location = locationArea.getProjectLocation();
 			String separator = location.endsWith(URI_SEPARATOR) ? "" : URI_SEPARATOR;
-			
+
 			IRemoteConnection conn = locationArea.getConnection();
 			if (conn instanceof RSEConnection) {
 				RSEConnection rseConn = (RSEConnection)conn;
@@ -294,7 +291,7 @@ public class OptionsPage extends FiniteStateWizardPage {
 			}
 		}
 	}
-	
+
 	private String getDefaultPathDisplayString(IRemoteConnection connection, IRemoteServices remoteServices) {
 		String projectName = getProjectName();
 		if (projectName.isEmpty())
@@ -306,7 +303,7 @@ public class OptionsPage extends FiniteStateWizardPage {
 				} catch (RemoteConnectionException e) {
 					e.printStackTrace();
 				}
-			
+
 			IRemoteFileManager fileMgr = remoteServices.getFileManager(connection);
 			URI defaultURI = fileMgr.toURI(connection.getWorkingDirectory());
 
@@ -322,19 +319,30 @@ public class OptionsPage extends FiniteStateWizardPage {
 		}
 		return ""; //$NON-NLS-1$
 	}
-	
+
 	private boolean isValidProjectName(String projectName) {
-		if (projectName.indexOf('$') > -1) {
+		if (projectName.contains("\\s+"))
+			return false;
+
+		if (projectName.indexOf('$') != -1)
 			return false;
-		}
 
+		char[] chars = projectName.toCharArray();
+		if (!Character.isJavaIdentifierStart(chars[0]))
+			return false;
+		for (int i = 1; i < chars.length; i++)
+			if (!Character.isJavaIdentifierPart(chars[i]))
+				return false;
 		return true;
-	} 
+	}
 	@Override
 	protected boolean validatePage() {
 		if  (!validateProjectName())
 			return false;
-		
+
+		if (!validateProjectLocation())
+			return false;
+
 		setErrorMessage(null);
 		setMessage("All the entries are valid, press \"Finish\" to start the process, "+
 				"this will take a while. Please don't interrupt till there's output in the Yocto Console window...");
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/newproject/BBConfigurationInitializeOperation.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/newproject/BBConfigurationInitializeOperation.java
index a2af6e4..7a68ed5 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/newproject/BBConfigurationInitializeOperation.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/newproject/BBConfigurationInitializeOperation.java
@@ -15,7 +15,6 @@ import java.lang.reflect.InvocationTargetException;
 
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jface.operation.IRunnableWithProgress;
-
 import org.yocto.bc.bitbake.BBSession;
 import org.yocto.bc.bitbake.ProjectInfoHelper;
 import org.yocto.bc.remote.utils.RemoteHelper;
@@ -37,13 +36,16 @@ public class BBConfigurationInitializeOperation implements IRunnableWithProgress
 		this.writer = writer;
 	}
 
+	@Override
 	public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
 		BBSession session;
 		try {
+			monitor.beginTask("Initialize bitbake session ...", RemoteHelper.TOTALWORKLOAD);
 			ProjectInfoHelper.store(RemoteHelper.getRemoteConnectionByName(pinfo.getConnection().getName()), pinfo.getURI(), pinfo, monitor);
 			session = Activator.getBBSession(pinfo, writer, monitor);
 			session.initialize();
-
+			monitor.worked(90);
+			monitor.done();
 		} catch (Exception e) {
 			throw new InvocationTargetException(e);
 		}
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/newproject/CreateBBCProjectOperation.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/newproject/CreateBBCProjectOperation.java
index fcc939c..1a19479 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/newproject/CreateBBCProjectOperation.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/newproject/CreateBBCProjectOperation.java
@@ -42,40 +42,40 @@ public class CreateBBCProjectOperation extends WorkspaceModifyOperation {
 	public static void addNatureToProject(IProject proj, String nature_id, IProgressMonitor monitor) throws CoreException {
 		IProjectDescription desc = proj.getDescription();
 		Vector<String> natureIds = new Vector<String>();
-		
+
 		natureIds.add(nature_id);
 		natureIds.addAll(Arrays.asList(desc.getNatureIds()));
-		desc.setNatureIds((String[]) natureIds.toArray(new String[natureIds.size()]));
-		
+		desc.setNatureIds(natureIds.toArray(new String[natureIds.size()]));
+
 		proj.setDescription(desc, monitor);
 	}
-	
+
 	private ProjectInfo projInfo;
 
 	public CreateBBCProjectOperation(ProjectInfo projInfo) {
 		this.projInfo = projInfo;
 	}
-	
+
 	protected void addNatures(IProject proj, IProgressMonitor monitor) throws CoreException {
 		addNatureToProject(proj, BitbakeCommanderNature.NATURE_ID, monitor);
 	}
 
 	private IProjectDescription createProjectDescription(IWorkspace workspace, ProjectInfo projInformation) throws CoreException {
 		IProjectDescription desc = workspace.newProjectDescription(projInformation.getProjectName());
-		
+
 		desc.setLocationURI(projInformation.getURI());
-		
+
 		return desc;
 	}
 
 	@Override
 	protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
 		IProjectDescription desc = createProjectDescription(ResourcesPlugin.getWorkspace(), projInfo);
-		
+
 		IWorkspaceRoot wsroot = ResourcesPlugin.getWorkspace().getRoot();
 
 		IProject proj = wsroot.getProject(projInfo.getProjectName());
-		
+
 		try {
 			proj.create(desc, monitor);
 			ProjectInfoHelper.store(RemoteHelper.getRemoteConnectionByName(projInfo.getConnection().getName()), proj.getLocationURI(), projInfo, monitor);
@@ -85,13 +85,9 @@ public class CreateBBCProjectOperation extends WorkspaceModifyOperation {
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
-		
-		
-		
-
 		addNatures(proj, monitor);
 	}
-	
+
 	public ProjectInfo getProjectInfo() {
 		return projInfo;
 	}
-- 
1.7.9.5




More information about the yocto mailing list