From dc95d5a7f73cefe97ac55a57aa5ed35ba0a6efbb Mon Sep 17 00:00:00 2001 From: Marc Khouzam Date: Mon, 28 Apr 2008 19:40:06 +0000 Subject: [PATCH] Bug 228265 Cleanup to have an internal utility class --- .../launching/GdbLaunchDelegate.java | 304 ++++++++++-------- 1 file changed, 161 insertions(+), 143 deletions(-) diff --git a/plugins/org.eclipse.dd.gdb/src/org/eclipse/dd/gdb/internal/provisional/launching/GdbLaunchDelegate.java b/plugins/org.eclipse.dd.gdb/src/org/eclipse/dd/gdb/internal/provisional/launching/GdbLaunchDelegate.java index 546cf6b05ee..e0d22abd5b2 100644 --- a/plugins/org.eclipse.dd.gdb/src/org/eclipse/dd/gdb/internal/provisional/launching/GdbLaunchDelegate.java +++ b/plugins/org.eclipse.dd.gdb/src/org/eclipse/dd/gdb/internal/provisional/launching/GdbLaunchDelegate.java @@ -100,12 +100,13 @@ public class GdbLaunchDelegate extends LaunchConfigurationDelegate monitor.subTask( "Debugging local C/C++ application" ); //$NON-NLS-1$ } - IPath exePath = verifyProgramPath( config ); - ICProject project = verifyCProject( config ); - if ( exePath != null ) { - verifyBinary( project, exePath ); - } - + // First verify we are dealing with a proper project. + ICProject project = LaunchUtils.verifyCProject(config); + // Now verify we know the program to debug. + IPath exePath = LaunchUtils.verifyProgramPath(config, project); + // Finally, make sure the program is a proper binary. + LaunchUtils.verifyBinary(config, exePath); + monitor.worked( 1 ); // If we are attaching, get the process id now, so as to avoid starting the launch @@ -183,7 +184,6 @@ public class GdbLaunchDelegate extends LaunchConfigurationDelegate return SessionType.RUN; } - // Copied from the CDT protected int promptForProcessID(ILaunchConfiguration config) throws CoreException { IStatus fPromptStatus = new Status(IStatus.INFO, "org.eclipse.debug.ui", 200, "", null); //$NON-NLS-1$//$NON-NLS-2$ IStatus processPrompt = new Status(IStatus.INFO, "org.eclipse.cdt.launch", 100, "", null); //$NON-NLS-1$//$NON-NLS-2$ @@ -199,11 +199,11 @@ public class GdbLaunchDelegate extends LaunchConfigurationDelegate } @Override - public boolean preLaunchCheck( ILaunchConfiguration config, String mode, IProgressMonitor monitor ) throws CoreException { + public boolean preLaunchCheck(ILaunchConfiguration config, String mode, IProgressMonitor monitor) throws CoreException { // no pre launch check for core file if (mode.equals(ILaunchManager.DEBUG_MODE) && getSessionType(config) == SessionType.CORE) return true; - return super.preLaunchCheck( config, mode, monitor ); + return super.preLaunchCheck(config, mode, monitor); } @Override @@ -238,135 +238,6 @@ public class GdbLaunchDelegate extends LaunchConfigurationDelegate return null; } - /** - * 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 - * lower level exception associated with the error, or - * null if none - * @param code - * error code - */ - protected void abort(String message, Throwable exception, int code) throws CoreException { - MultiStatus status = new MultiStatus(GdbPlugin.PLUGIN_ID, code, message, exception); - status.add(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, code, exception == null ? "" : exception.getLocalizedMessage(), //$NON-NLS-1$ - exception)); - throw new CoreException(status); - } - - public static ICProject getCProject(ILaunchConfiguration configuration) throws CoreException { - String projectName = getProjectName(configuration); - if (projectName != null) { - projectName = projectName.trim(); - if (projectName.length() > 0) { - IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName); - ICProject cProject = CCorePlugin.getDefault().getCoreModel().create(project); - if (cProject != null && cProject.exists()) { - return cProject; - } - } - } - return null; - } - - public static String getProjectName(ILaunchConfiguration configuration) throws CoreException { - return configuration.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, (String)null); - } - - public static String getProgramName(ILaunchConfiguration configuration) throws CoreException { - return configuration.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, (String)null); - } - - public static IPath getProgramPath(ILaunchConfiguration configuration) throws CoreException { - String path = getProgramName(configuration); - if (path == null) { - return null; - } - return new Path(path); - } - - protected ICProject verifyCProject(ILaunchConfiguration config) throws CoreException { - String name = getProjectName(config); - if (name == null) { - abort(LaunchMessages.getString("AbstractCLaunchDelegate.C_Project_not_specified"), null, //$NON-NLS-1$ - ICDTLaunchConfigurationConstants.ERR_UNSPECIFIED_PROJECT); - } - ICProject cproject = getCProject(config); - if (cproject == null) { - IProject proj = ResourcesPlugin.getWorkspace().getRoot().getProject(name); - if (!proj.exists()) { - abort( - LaunchMessages.getFormattedString("AbstractCLaunchDelegate.Project_NAME_does_not_exist", name), null, //$NON-NLS-1$ - ICDTLaunchConfigurationConstants.ERR_NOT_A_C_PROJECT); - } else if (!proj.isOpen()) { - abort(LaunchMessages.getFormattedString("AbstractCLaunchDelegate.Project_NAME_is_closed", name), null, //$NON-NLS-1$ - ICDTLaunchConfigurationConstants.ERR_NOT_A_C_PROJECT); - } - abort(LaunchMessages.getString("AbstractCLaunchDelegate.Not_a_C_CPP_project"), null, //$NON-NLS-1$ - ICDTLaunchConfigurationConstants.ERR_NOT_A_C_PROJECT); - } - return cproject; - } - - protected IPath verifyProgramPath(ILaunchConfiguration config) throws CoreException { - ICProject cproject = verifyCProject(config); - IPath programPath = getProgramPath(config); - if (programPath == null || programPath.isEmpty()) { - return null; - } - if (!programPath.isAbsolute()) { - IFile wsProgramPath = cproject.getProject().getFile(programPath); - programPath = wsProgramPath.getLocation(); - } - if (!programPath.toFile().exists()) { - abort( - LaunchMessages.getString("AbstractCLaunchDelegate.Program_file_does_not_exist"), //$NON-NLS-1$ - new FileNotFoundException( - LaunchMessages.getFormattedString( - "AbstractCLaunchDelegate.PROGRAM_PATH_not_found", programPath.toOSString())), //$NON-NLS-1$ - ICDTLaunchConfigurationConstants.ERR_PROGRAM_NOT_EXIST); - } - return programPath; - } - - /** - * @param project - * @param exePath - * @return - * @throws CoreException - */ - protected IBinaryObject verifyBinary(ICProject proj, IPath exePath) throws CoreException { - ICExtensionReference[] parserRef = CCorePlugin.getDefault().getBinaryParserExtensions(proj.getProject()); - for (int i = 0; i < parserRef.length; i++) { - try { - IBinaryParser parser = (IBinaryParser)parserRef[i].createExtension(); - IBinaryObject exe = (IBinaryObject)parser.getBinary(exePath); - if (exe != null) { - return exe; - } - } catch (ClassCastException e) { - } catch (IOException e) { - } - } - IBinaryParser parser = CCorePlugin.getDefault().getDefaultBinaryParser(); - try { - return (IBinaryObject)parser.getBinary(exePath); - } catch (ClassCastException e) { - } catch (IOException e) { - } - Throwable exception = new FileNotFoundException(LaunchMessages.getFormattedString( - "AbstractCLaunchDelegate.Program_is_not_a_recongnized_executable", exePath.toOSString())); //$NON-NLS-1$ - int code = ICDTLaunchConfigurationConstants.ERR_PROGRAM_NOT_BINARY; - MultiStatus status = new MultiStatus(GdbPlugin.PLUGIN_ID, code, - LaunchMessages.getString("AbstractCLaunchDelegate.Program_is_not_a_recongnized_executable"), exception); //$NON-NLS-1$ - status.add(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, code, exception == null ? "" : exception.getLocalizedMessage(), //$NON-NLS-1$ - exception)); - throw new CoreException(status); - } - /** * Recursively creates a set of projects referenced by the current project * @@ -381,7 +252,7 @@ public class GdbLaunchDelegate extends LaunchConfigurationDelegate private HashSet getReferencedProjectSet(IProject proj, HashSet referencedProjSet) throws CoreException { // The top project is a reference too and it must be added at the top to avoid cycles referencedProjSet.add(proj); - + IProject[] projects = proj.getReferencedProjects(); for (IProject refProject : projects) { if (refProject.exists() && !referencedProjSet.contains(refProject)) { @@ -400,7 +271,7 @@ public class GdbLaunchDelegate extends LaunchConfigurationDelegate IProject[] orderedProjects = null; ArrayList orderedProjList = null; - ICProject cProject = getCProject(configuration); + ICProject cProject = LaunchUtils.verifyCProject(configuration); if (cProject != null) { HashSet projectSet = getReferencedProjectSet(cProject.getProject(), new HashSet()); @@ -420,7 +291,7 @@ public class GdbLaunchDelegate extends LaunchConfigurationDelegate } } } - + // Add any remaining projects to the end of the list orderedProjList.addAll(unorderedProjects); @@ -439,7 +310,7 @@ public class GdbLaunchDelegate extends LaunchConfigurationDelegate protected IProject[] getProjectsForProblemSearch(ILaunchConfiguration configuration, String mode) throws CoreException { return getBuildOrder(configuration, mode); } - + /** * Searches for compile errors in the specified project * Used in finalLaunchCheck() @@ -447,7 +318,6 @@ public class GdbLaunchDelegate extends LaunchConfigurationDelegate * The project to search * @return true if compile errors exist, otherwise false */ - @Override protected boolean existsProblems(IProject proj) throws CoreException { IMarker[] markers = proj.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE); @@ -461,4 +331,152 @@ public class GdbLaunchDelegate extends LaunchConfigurationDelegate } return false; } + + private static class LaunchUtils { + /** + * Verify the following things about the project: + * - is a valid project name given + * - does the project exist + * - is the project open + * - is the project a C/C++ project + */ + public static ICProject verifyCProject(ILaunchConfiguration configuration) throws CoreException { + String name = getProjectName(configuration); + if (name == null) { + abort(LaunchMessages.getString("AbstractCLaunchDelegate.C_Project_not_specified"), null, //$NON-NLS-1$ + ICDTLaunchConfigurationConstants.ERR_UNSPECIFIED_PROJECT); + } + ICProject cproject = getCProject(configuration); + if (cproject == null) { + IProject proj = ResourcesPlugin.getWorkspace().getRoot().getProject(name); + if (!proj.exists()) { + abort( + LaunchMessages.getFormattedString("AbstractCLaunchDelegate.Project_NAME_does_not_exist", name), null, //$NON-NLS-1$ + ICDTLaunchConfigurationConstants.ERR_NOT_A_C_PROJECT); + } else if (!proj.isOpen()) { + abort(LaunchMessages.getFormattedString("AbstractCLaunchDelegate.Project_NAME_is_closed", name), null, //$NON-NLS-1$ + ICDTLaunchConfigurationConstants.ERR_NOT_A_C_PROJECT); + } + abort(LaunchMessages.getString("AbstractCLaunchDelegate.Not_a_C_CPP_project"), null, //$NON-NLS-1$ + ICDTLaunchConfigurationConstants.ERR_NOT_A_C_PROJECT); + } + return cproject; + } + + + /** + * Verify that program name of the configuration can be found as a file. + * + * @return Absolute path of the program location + */ + public static IPath verifyProgramPath(ILaunchConfiguration configuration, ICProject cproject) throws CoreException { + String programName = configuration.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, (String)null); + if (programName == null) { + abort(LaunchMessages.getString("AbstractCLaunchDelegate.Program_file_not_specified"), null, //$NON-NLS-1$ + ICDTLaunchConfigurationConstants.ERR_NOT_A_C_PROJECT); + } + + IPath programPath = new Path(programName); + if (programPath.isEmpty()) { + abort(LaunchMessages.getString("AbstractCLaunchDelegate.Program_file_does_not_exist"), null, //$NON-NLS-1$ + ICDTLaunchConfigurationConstants.ERR_NOT_A_C_PROJECT); + } + + if (!programPath.isAbsolute()) { + // Find the specified program within the specified project + IFile wsProgramPath = cproject.getProject().getFile(programPath); + programPath = wsProgramPath.getLocation(); + } + + if (!programPath.toFile().exists()) { + abort(LaunchMessages.getString("AbstractCLaunchDelegate.Program_file_does_not_exist"), //$NON-NLS-1$ + new FileNotFoundException( + LaunchMessages.getFormattedString("AbstractCLaunchDelegate.PROGRAM_PATH_not_found", //$NON-NLS-1$ + programPath.toOSString())), + ICDTLaunchConfigurationConstants.ERR_PROGRAM_NOT_EXIST); + } + + return programPath; + } + + + /** + * Verify that the executable path points to a valid binary file. + * + * @return An object representing the binary file. + */ + public static IBinaryObject verifyBinary(ILaunchConfiguration configuration, IPath exePath) throws CoreException { + ICExtensionReference[] parserRefs = CCorePlugin.getDefault().getBinaryParserExtensions(getCProject(configuration).getProject()); + for (ICExtensionReference parserRef : parserRefs) { + try { + IBinaryParser parser = (IBinaryParser)parserRef.createExtension(); + IBinaryObject exe = (IBinaryObject)parser.getBinary(exePath); + if (exe != null) { + return exe; + } + } catch (ClassCastException e) { + } catch (IOException e) { + } + } + + IBinaryParser parser = CCorePlugin.getDefault().getDefaultBinaryParser(); + try { + return (IBinaryObject)parser.getBinary(exePath); + } catch (ClassCastException e) { + } catch (IOException e) { + } + + abort(LaunchMessages.getString("AbstractCLaunchDelegate.Program_is_not_a_recognized_executable"), //$NON-NLS-1$ + new FileNotFoundException( + LaunchMessages.getFormattedString("AbstractCLaunchDelegate.Program_is_not_a_recognized_executable", //$NON-NLS-1$ + exePath.toOSString())), + ICDTLaunchConfigurationConstants.ERR_PROGRAM_NOT_BINARY); + + return null; + } + + /** + * 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 + * lower level exception associated with the error, or + * null if none + * @param code + * error code + */ + private static void abort(String message, Throwable exception, int code) throws CoreException { + MultiStatus status = new MultiStatus(GdbPlugin.PLUGIN_ID, code, message, exception); + status.add(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, code, + exception == null ? "" : exception.getLocalizedMessage(), //$NON-NLS-1$ + exception)); + throw new CoreException(status); + } + + /** + * Returns an ICProject based on the project name provided in the configuration. + * First look for a project by name, and then confirm it is a C/C++ project. + */ + private static ICProject getCProject(ILaunchConfiguration configuration) throws CoreException { + String projectName = getProjectName(configuration); + if (projectName != null) { + projectName = projectName.trim(); + if (projectName.length() > 0) { + IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName); + ICProject cProject = CCorePlugin.getDefault().getCoreModel().create(project); + if (cProject != null && cProject.exists()) { + return cProject; + } + } + } + return null; + } + + private static String getProjectName(ILaunchConfiguration configuration) throws CoreException { + return configuration.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, (String)null); + } + } + }