From e726ac9355c039b256b8ec92349e95027cee0eff Mon Sep 17 00:00:00 2001 From: Mikhail Khodjaiants Date: Thu, 23 Oct 2003 17:36:13 +0000 Subject: [PATCH] Core support of the new workbench preferences: 'Source Locations' and 'Search For Duplicate Source Files'. --- debug/org.eclipse.cdt.debug.core/ChangeLog | 7 + .../cdt/debug/core/CDebugCorePlugin.java | 12 ++ .../cdt/debug/core/ICDebugConstants.java | 11 ++ .../core/sourcelookup/CSourceLocator.java | 11 +- .../core/sourcelookup/SourceUtils.java | 176 ++++++++++++++++++ 5 files changed, 215 insertions(+), 2 deletions(-) create mode 100644 debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceUtils.java diff --git a/debug/org.eclipse.cdt.debug.core/ChangeLog b/debug/org.eclipse.cdt.debug.core/ChangeLog index a1074340a1b..2db436630e4 100644 --- a/debug/org.eclipse.cdt.debug.core/ChangeLog +++ b/debug/org.eclipse.cdt.debug.core/ChangeLog @@ -1,3 +1,10 @@ +2003-10-23 Mikhail Khodjaiants + Core support of the new workbench preferences: 'Source Locations' and 'Search + For Duplicate Source Files'. + * CDebugCorePlugin.java + * ICDebugConstants.java + * SourceUtils.java: new + 2003-10-20 Mikhail Khodjaiants Core support of the "Search subfolders" option for directory source locations. * IDirectorySourceLocation.java diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugCorePlugin.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugCorePlugin.java index b4373fa2ecf..76e4ae846ca 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugCorePlugin.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugCorePlugin.java @@ -8,9 +8,11 @@ package org.eclipse.cdt.debug.core; import java.util.HashMap; +import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation; import org.eclipse.cdt.debug.internal.core.DebugConfiguration; import org.eclipse.cdt.debug.internal.core.SessionManager; import org.eclipse.cdt.debug.internal.core.breakpoints.CBreakpoint; +import org.eclipse.cdt.debug.internal.core.sourcelookup.SourceUtils; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; @@ -229,4 +231,14 @@ public class CDebugCorePlugin extends Plugin fSessionManager.dispose(); fSessionManager = sm; } + + public void saveCommonSourceLocations( ICSourceLocation[] locations ) + { + CDebugCorePlugin.getDefault().getPluginPreferences().setValue( ICDebugConstants.PREF_SOURCE_LOCATIONS, SourceUtils.getCommonSourceLocationsMemento( locations ) ); + } + + public ICSourceLocation[] getCommonSourceLocations() + { + return SourceUtils.getCommonSourceLocationsFromMemento( CDebugCorePlugin.getDefault().getPluginPreferences().getString( ICDebugConstants.PREF_SOURCE_LOCATIONS ) ); + } } diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ICDebugConstants.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ICDebugConstants.java index c7be4df97cf..1529622fd02 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ICDebugConstants.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ICDebugConstants.java @@ -58,6 +58,17 @@ public interface ICDebugConstants */ public static final String PREF_MAX_NUMBER_OF_INSTRUCTIONS = PLUGIN_ID + "cDebug.max_number_of_instructions"; //$NON-NLS-1$ + /** + * Boolean preference controlling whether the search for duplicate source files + * will be performed by debugger. + */ + public static final String PREF_SEARCH_DUPLICATE_FILES = PLUGIN_ID + "cDebug.Source.search_duplicate_files"; //$NON-NLS-1$ + + /** + * The identifier of the common source locations list + */ + public static final String PREF_SOURCE_LOCATIONS = PLUGIN_ID + "cDebug.Source.source_locations"; //$NON-NLS-1$ + /** * The default number of instructions displayed in disassembly. */ diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CSourceLocator.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CSourceLocator.java index bff11bee30d..e1140008edb 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CSourceLocator.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CSourceLocator.java @@ -23,6 +23,7 @@ import javax.xml.parsers.ParserConfigurationException; import org.apache.xerces.dom.DocumentImpl; import org.eclipse.cdt.debug.core.CDebugCorePlugin; import org.eclipse.cdt.debug.core.CDebugUtils; +import org.eclipse.cdt.debug.core.ICDebugConstants; import org.eclipse.cdt.debug.core.model.IStackFrameInfo; import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation; import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator; @@ -316,7 +317,13 @@ public class CSourceLocator implements ICSourceLocator, IPersistableSourceLocato */ public void initializeDefaults( ILaunchConfiguration configuration ) throws CoreException { - setSourceLocations( getDefaultSourceLocations() ); + ICSourceLocation[] defaultLocations = getDefaultSourceLocations(); + ICSourceLocation[] commonLocations = CDebugCorePlugin.getDefault().getCommonSourceLocations(); + List list = new ArrayList( defaultLocations.length + commonLocations.length ); + list.addAll( Arrays.asList( defaultLocations ) ); + list.addAll( Arrays.asList( commonLocations ) ); + setSourceLocations( (ICSourceLocation[])list.toArray( new ICSourceLocation[list.size()] ) ); + fDuplicateFiles = CDebugCorePlugin.getDefault().getPluginPreferences().getBoolean( ICDebugConstants.PREF_SEARCH_DUPLICATE_FILES ); } /* (non-Javadoc) @@ -662,7 +669,7 @@ public class CSourceLocator implements ICSourceLocator, IPersistableSourceLocato IProject project = (IProject)it.next(); if ( project != null && project.exists() && project.isOpen() ) list.add( SourceLocationFactory.createProjectSourceLocation( project ) ); - } + } return (ICSourceLocation[])list.toArray( new ICSourceLocation[list.size()] ); } diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceUtils.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceUtils.java new file mode 100644 index 00000000000..3a6ead4d6a1 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceUtils.java @@ -0,0 +1,176 @@ +/* + *(c) Copyright QNX Software Systems Ltd. 2002. + * All Rights Reserved. + * + */ + +package org.eclipse.cdt.debug.internal.core.sourcelookup; + +import java.io.IOException; +import java.io.StringReader; +import java.text.MessageFormat; +import java.util.LinkedList; +import java.util.List; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.apache.xerces.dom.DocumentImpl; +import org.eclipse.cdt.debug.core.CDebugCorePlugin; +import org.eclipse.cdt.debug.core.CDebugUtils; +import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +/** + * Enter type comment. + * + * @since Oct 22, 2003 + */ +public class SourceUtils +{ + private static final String NAME_COMMON_SOURCE_LOCATIONS = "commonSourceLocations"; + private static final String NAME_SOURCE_LOCATION = "sourceLocation"; + private static final String ATTR_CLASS = "class"; + private static final String ATTR_MEMENTO = "memento"; + + public static String getCommonSourceLocationsMemento( ICSourceLocation[] locations ) + { + Document doc = new DocumentImpl(); + Element node = doc.createElement( NAME_COMMON_SOURCE_LOCATIONS ); + doc.appendChild( node ); + + saveSourceLocations( doc, node, locations ); + try + { + return CDebugUtils.serializeDocument( doc, " " ); + } + catch( IOException e ) + { + CDebugCorePlugin.log( new Status( IStatus.ERROR, CDebugCorePlugin.getUniqueIdentifier(), 0, "Error saving common source settings.", e ) ); + } + return null; + } + + private static void saveSourceLocations( Document doc, Element node, ICSourceLocation[] locations ) + { + for ( int i = 0; i < locations.length; i++ ) + { + Element child = doc.createElement( NAME_SOURCE_LOCATION ); + child.setAttribute( ATTR_CLASS, locations[i].getClass().getName() ); + try + { + child.setAttribute( ATTR_MEMENTO, locations[i].getMemento() ); + } + catch( CoreException e ) + { + CDebugCorePlugin.log( e ); + continue; + } + node.appendChild( child ); + } + } + + public static ICSourceLocation[] getCommonSourceLocationsFromMemento( String memento ) + { + ICSourceLocation[] result = new ICSourceLocation[0]; + if ( memento != null ) + { + try + { + DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + StringReader reader = new StringReader( memento ); + InputSource source = new InputSource( reader ); + Element root = parser.parse( source ).getDocumentElement(); + + if ( root.getNodeName().equalsIgnoreCase( NAME_COMMON_SOURCE_LOCATIONS ) ) + result = initializeSourceLocations( root ); + } + catch( ParserConfigurationException e ) + { + CDebugCorePlugin.log( new Status( IStatus.ERROR, CDebugCorePlugin.getUniqueIdentifier(), 0, "Error initializing common source settings.", e ) ); + } + catch( SAXException e ) + { + CDebugCorePlugin.log( new Status( IStatus.ERROR, CDebugCorePlugin.getUniqueIdentifier(), 0, "Error initializing common source settings.", e ) ); + } + catch( IOException e ) + { + CDebugCorePlugin.log( new Status( IStatus.ERROR, CDebugCorePlugin.getUniqueIdentifier(), 0, "Error initializing common source settings.", e ) ); + } + } + return result; + } + + public static ICSourceLocation[] initializeSourceLocations( Element root ) + { + List sourceLocations = new LinkedList(); + ClassLoader classLoader = CDebugCorePlugin.getDefault() .getDescriptor().getPluginClassLoader(); + + NodeList list = root.getChildNodes(); + int length = list.getLength(); + for ( int i = 0; i < length; ++i ) + { + Node node = list.item( i ); + short type = node.getNodeType(); + if ( type == Node.ELEMENT_NODE ) + { + Element entry = (Element)node; + if ( entry.getNodeName().equalsIgnoreCase( NAME_SOURCE_LOCATION ) ) + { + String className = entry.getAttribute( ATTR_CLASS ); + String data = entry.getAttribute( ATTR_MEMENTO ); + if ( className == null || className.trim().length() == 0 ) + { + CDebugCorePlugin.log( "Unable to restore common source locations - invalid format." ); + continue; + } + Class clazz = null; + try + { + clazz = classLoader.loadClass( className ); + } + catch( ClassNotFoundException e ) + { + CDebugCorePlugin.log( MessageFormat.format( "Unable to restore source location - class not found {0}", new String[] { className } ) ); + continue; + } + + ICSourceLocation location = null; + try + { + location = (ICSourceLocation)clazz.newInstance(); + } + catch( IllegalAccessException e ) + { + CDebugCorePlugin.log( "Unable to restore source location: " + e.getMessage() ); + continue; + } + catch( InstantiationException e ) + { + CDebugCorePlugin.log( "Unable to restore source location: " + e.getMessage() ); + continue; + } + try + { + location.initializeFrom( data ); + sourceLocations.add( location ); + } + catch( CoreException e ) + { + CDebugCorePlugin.log( "Unable to restore source location: " + e.getMessage() ); + } + } + } + } + return (ICSourceLocation[])sourceLocations.toArray( new ICSourceLocation[sourceLocations.size()] ); + } +}