cdt/cdt_5_0_x/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/executables/ExecutablesManager.java
author wpaul
Mon, 01 Jun 2009 19:15:36 -0500
changeset 14 c50c3d06898c
parent 0 0e6d23e2b466
child 15 3ac8c55882b5
permissions -rw-r--r--
executables view changes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
     1
/*******************************************************************************
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
     2
 * Copyright (c) 2008 Nokia and others.
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
     3
 * All rights reserved. This program and the accompanying materials
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
     4
 * are made available under the terms of the Eclipse Public License v1.0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
     5
 * which accompanies this distribution, and is available at
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
     6
 * http://www.eclipse.org/legal/epl-v10.html
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
     7
 *
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
     8
 * Contributors:
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
     9
 * Nokia - Initial API and implementation
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    10
 *******************************************************************************/
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    11
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    12
package org.eclipse.cdt.debug.core.executables;
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    13
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    14
import java.text.DateFormat;
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    15
import java.util.ArrayList;
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    16
import java.util.Collection;
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    17
import java.util.Collections;
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    18
import java.util.Comparator;
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    19
import java.util.Date;
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    20
import java.util.HashMap;
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    21
import java.util.List;
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    22
import java.util.Map;
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    23
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    24
import org.eclipse.cdt.core.model.CoreModel;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    25
import org.eclipse.cdt.core.settings.model.CProjectDescriptionEvent;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    26
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    27
import org.eclipse.cdt.core.settings.model.ICProjectDescriptionListener;
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    28
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    29
import org.eclipse.core.resources.IProject;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    30
import org.eclipse.core.resources.IProjectDescription;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    31
import org.eclipse.core.resources.IResource;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    32
import org.eclipse.core.resources.IResourceChangeEvent;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    33
import org.eclipse.core.resources.IResourceChangeListener;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    34
import org.eclipse.core.resources.IResourceDelta;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    35
import org.eclipse.core.resources.IResourceDeltaVisitor;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    36
import org.eclipse.core.resources.ResourcesPlugin;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    37
import org.eclipse.core.runtime.CoreException;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    38
import org.eclipse.core.runtime.IConfigurationElement;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    39
import org.eclipse.core.runtime.IExtension;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    40
import org.eclipse.core.runtime.IExtensionPoint;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    41
import org.eclipse.core.runtime.IExtensionRegistry;
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    42
import org.eclipse.core.runtime.IPath;
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    43
import org.eclipse.core.runtime.IProgressMonitor;
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    44
import org.eclipse.core.runtime.IStatus;
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    45
import org.eclipse.core.runtime.MultiStatus;
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    46
import org.eclipse.core.runtime.Platform;
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    47
import org.eclipse.core.runtime.PlatformObject;
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    48
import org.eclipse.core.runtime.Status;
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    49
import org.eclipse.core.runtime.SubMonitor;
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    50
import org.eclipse.core.runtime.SubProgressMonitor;
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    51
import org.eclipse.core.runtime.jobs.Job;
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    52
import org.eclipse.osgi.service.debug.DebugOptions;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    53
import org.osgi.framework.BundleContext;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    54
import org.osgi.framework.ServiceReference;
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    55
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    56
/**
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    57
 * The Executables Manager maintains a collection of executables built by all of
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    58
 * the projects in the workspace. Executables are contributed by instances of
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    59
 * IExecutablesProvider.
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    60
 * 
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    61
 * @author Ken Ryall
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    62
 * 
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    63
 */
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    64
public class ExecutablesManager extends PlatformObject implements IResourceChangeListener, ICProjectDescriptionListener {
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    65
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    66
	private static final String EXECUTABLES_MANAGER_DEBUG_TRACING = CDebugCorePlugin.PLUGIN_ID + "EXECUTABLES_MANAGER_DEBUG_TRACING"; //$NON-NLS-1$
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    67
	
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    68
	private Map<IProject, IProjectExecutablesProvider> executablesProviderMap = new HashMap<IProject, IProjectExecutablesProvider>();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    69
	private Map<IProject, List<Executable>> executablesMap = new HashMap<IProject, List<Executable>>();
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    70
	private List<IExecutablesChangeListener> changeListeners = Collections.synchronizedList(new ArrayList<IExecutablesChangeListener>());
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    71
	private List<IProjectExecutablesProvider> executableProviders;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    72
	private List<ISourceFilesProvider> sourceFileProviders;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    73
	private List<ISourceFileRemapping> sourceFileRemappings;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    74
	private List<IExecutableImporter> executableImporters;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    75
	
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    76
	private boolean DEBUG;
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    77
	
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    78
	private Job refreshJob = new Job("Get Executables") {
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    79
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    80
		@Override
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
    81
		public IStatus run(IProgressMonitor monitor) {
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    82
				
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    83
			trace("Get Executables job started at " + getStringFromTimestamp(System.currentTimeMillis()));
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    84
			
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    85
			List<IProject> projects = getProjectsToCheck();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    86
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    87
			SubMonitor subMonitor = SubMonitor.convert(monitor, projects.size());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    88
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    89
			for (IProject project : projects) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    90
				if (subMonitor.isCanceled()) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    91
					trace("Get Executables job cancelled at " + getStringFromTimestamp(System.currentTimeMillis()));
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    92
					return Status.CANCEL_STATUS;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    93
				}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    94
				
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    95
				subMonitor.subTask("Checking project: " + project.getName());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    96
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    97
				// get the executables provider for this project
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    98
				IProjectExecutablesProvider provider = getExecutablesProviderForProject(project);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
    99
				if (provider != null) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   100
					trace("Getting executables for project: " + project.getName() + " using " + provider.toString());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   101
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   102
					// store the list of executables for this project
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   103
					synchronized (executablesMap) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   104
						executablesMap.put(project, provider.getExecutables(project, subMonitor.newChild(1, SubMonitor.SUPPRESS_NONE)));
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   105
					}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   106
				}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   107
			}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   108
			
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   109
			// notify the listeners
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   110
			synchronized (changeListeners) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   111
				for (IExecutablesChangeListener listener : changeListeners) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   112
					listener.executablesListChanged();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   113
				}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   114
			}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   115
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   116
			trace("Get Executables job finished at " + getStringFromTimestamp(System.currentTimeMillis()));
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   117
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   118
			return Status.OK_STATUS;
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   119
		}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   120
	};
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   121
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   122
	private static ExecutablesManager executablesManager = null;
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   123
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   124
	/**
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   125
	 * Get the executables manager instance
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   126
	 * @return the executables manager
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   127
	 */
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   128
	public static ExecutablesManager getExecutablesManager() {
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   129
		if (executablesManager == null)
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   130
			executablesManager = new ExecutablesManager();
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   131
		return executablesManager;
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   132
	}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   133
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   134
	public ExecutablesManager() {
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   135
		
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   136
		// check if debugging is enabled
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   137
		BundleContext context = CDebugCorePlugin.getDefault().getBundle().getBundleContext();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   138
		if (context != null) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   139
			ServiceReference reference = CDebugCorePlugin.getDefault().getBundle().getBundleContext().getServiceReference(DebugOptions.class.getName());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   140
			if (reference != null) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   141
				DebugOptions service = (DebugOptions) context.getService(reference);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   142
				if (service != null) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   143
					try {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   144
						DEBUG = service.getBooleanOption(EXECUTABLES_MANAGER_DEBUG_TRACING, false);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   145
					} finally {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   146
						// we have what we want - release the service
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   147
						context.ungetService(reference);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   148
					}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   149
				}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   150
			}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   151
		}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   152
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   153
		refreshJob.setPriority(Job.SHORT);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   154
		
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   155
		// load the extension points
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   156
		loadExecutableProviderExtensions();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   157
		loadSoureFileProviderExtensions();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   158
		loadSoureRemappingExtensions();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   159
		loadExecutableImporterExtensions();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   160
		
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   161
		// add the standard providers
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   162
		executableProviders.add(0, new StandardExecutableProvider());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   163
		sourceFileProviders.add(0, new StandardSourceFilesProvider());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   164
		sourceFileRemappings.add(0, new StandardSourceFileRemapping());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   165
		executableImporters.add(0, new StandardExecutableImporter());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   166
		
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   167
		// listen for events we're interested in
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   168
		ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.POST_BUILD);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   169
		CoreModel.getDefault().getProjectDescriptionManager().addCProjectDescriptionListener(this,
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   170
				CProjectDescriptionEvent.DATA_APPLIED);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   171
		
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   172
		// schedule a refresh so we get up to date
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   173
		scheduleRefresh();
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   174
	}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   175
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   176
	/**
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   177
	 * Adds an executable listener
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   178
	 * @param listener the listener to add
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   179
	 */
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   180
	public void addExecutablesChangeListener(IExecutablesChangeListener listener) {
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   181
		changeListeners.add(listener);
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   182
	}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   183
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   184
	/**
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   185
	 * Removes an executable listener
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   186
	 * @param listener the listener to remove
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   187
	 */
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   188
	public void removeExecutablesChangeListener(IExecutablesChangeListener listener) {
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   189
		changeListeners.remove(listener);
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   190
	}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   191
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   192
	/**
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   193
	 * Gets the list of executables in the workspace.
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   194
	 * @return the list of executables which may be empty
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   195
	 */
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   196
	public Collection<Executable> getExecutables() {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   197
		
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   198
		trace("getExecutables called at " + getStringFromTimestamp(System.currentTimeMillis()));
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   199
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   200
		List<Executable> executables = new ArrayList<Executable>();
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   201
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   202
		synchronized (executablesMap) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   203
			for (List<Executable> exes : executablesMap.values()) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   204
				for (Executable exe : exes) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   205
					if (!executables.contains(exe)) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   206
						executables.add(exe);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   207
					}
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   208
				}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   209
			}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   210
		}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   211
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   212
		trace("getExecutables returned at " + getStringFromTimestamp(System.currentTimeMillis()));
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   213
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   214
		return executables;
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   215
	}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   216
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   217
	/**
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   218
	 * Gets the collection of executables for the given project
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   219
	 * @param project the project
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   220
	 * @return collection of executables which may be empty
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   221
	 */
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   222
	public Collection<Executable> getExecutablesForProject(IProject project) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   223
		List<Executable> executables = new ArrayList<Executable>();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   224
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   225
		synchronized (executablesMap) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   226
			List<Executable> exes = executablesMap.get(project);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   227
			if (exes != null) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   228
				for (Executable exe : exes) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   229
					if (!executables.contains(exe)) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   230
						executables.add(exe);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   231
					}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   232
				}
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   233
			}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   234
		}
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   235
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   236
		return executables;
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   237
	}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   238
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   239
	/**
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   240
	 * Attempt to remap the path to the given source file in the given executable using
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   241
	 * source file mapping extensions
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   242
	 * @param executable the executable
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   243
	 * @param filePath the absolute path to the source file
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   244
	 * @return the new path to the source file, which was remapped if possible
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   245
	 */
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   246
	public String remapSourceFile(Executable executable, String filePath) {
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   247
		synchronized (sourceFileRemappings) {
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   248
			for (ISourceFileRemapping remapping : sourceFileRemappings) {
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   249
				String remappedPath = remapping.remapSourceFile(executable.getPath(), filePath);
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   250
				if (!remappedPath.equals(filePath))
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   251
					return remappedPath;
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   252
			}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   253
		}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   254
		return filePath;
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   255
	}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   256
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   257
	/**
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   258
	 * Import the given executables into the manager
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   259
	 * @param fileNames the absolute paths of the executables to import
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   260
	 * @param monitor progress monitor
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   261
	 */
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   262
	public void importExecutables(final String[] fileNames, IProgressMonitor monitor) {
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   263
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   264
		monitor.beginTask("Import Executables", executableImporters.size());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   265
		synchronized (executableImporters) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   266
			Collections.sort(executableImporters, new Comparator<IExecutableImporter>() {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   267
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   268
				public int compare(IExecutableImporter arg0, IExecutableImporter arg1) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   269
					int p0 = arg0.getPriority(fileNames);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   270
					int p1 = arg1.getPriority(fileNames);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   271
					if (p0 < p1)
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   272
						return 1;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   273
					if (p0 > p1)
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   274
						return -1;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   275
					return 0;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   276
				}});
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   277
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   278
			for (IExecutableImporter importer : executableImporters) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   279
				boolean handled = importer.importExecutables(fileNames, new SubProgressMonitor(monitor, 1));
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   280
				if (handled || monitor.isCanceled()) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   281
					break;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   282
				}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   283
			}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   284
		}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   285
		
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   286
		scheduleRefresh();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   287
	}
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   288
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   289
	/**
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   290
	 * Determines if the given executable is currently known by the manager
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   291
	 * @param exePath the absolute path to the executable
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   292
	 * @return true if the manager knows about it, false otherwise
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   293
	 */
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   294
	public boolean executableExists(IPath exePath) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   295
		synchronized (executablesMap) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   296
			for (List<Executable> exes : executablesMap.values()) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   297
				for (Executable exe : exes) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   298
					if (exe.getPath().equals(exePath)) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   299
						return true;
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   300
					}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   301
				}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   302
			}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   303
		}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   304
		
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   305
		return false;
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   306
	}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   307
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   308
	/**
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   309
	 * Get the list of source files for the given executable
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   310
	 * @param executable the executable
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   311
	 * @param monitor progress monitor
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   312
	 * @return an array of source files which may be empty
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   313
	 */
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   314
	public String[] getSourceFiles(final Executable executable, IProgressMonitor monitor) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   315
		String[] result = new String[0];
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   316
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   317
		trace("getSourceFiles called at " + getStringFromTimestamp(System.currentTimeMillis()) + " for " + executable.getPath().toOSString());
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   318
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   319
		synchronized (sourceFileProviders) {
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   320
			Collections.sort(sourceFileProviders, new Comparator<ISourceFilesProvider>() {
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   321
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   322
				public int compare(ISourceFilesProvider arg0, ISourceFilesProvider arg1) {
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   323
					int p0 = arg0.getPriority(executable);
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   324
					int p1 = arg1.getPriority(executable);
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   325
					if (p0 < p1)
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   326
						return 1;
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   327
					if (p0 > p1)
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   328
						return -1;
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   329
					return 0;
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   330
				}});
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   331
			
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   332
			monitor.beginTask("Finding source files in " + executable.getName(), sourceFileProviders.size());
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   333
			for (ISourceFilesProvider provider : sourceFileProviders) {
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   334
				String[] sourceFiles = provider.getSourceFiles(executable, new SubProgressMonitor(monitor, 1));
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   335
				if (sourceFiles.length > 0) {
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   336
					result = sourceFiles;
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   337
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   338
					trace("getSourceFiles got " + sourceFiles.length + " files from " + provider.toString());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   339
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   340
					break;
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   341
				}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   342
			}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   343
			monitor.done();
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   344
		}
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   345
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   346
		trace("getSourceFiles returned at " + getStringFromTimestamp(System.currentTimeMillis()));
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   347
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   348
		return result;
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   349
	}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   350
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   351
	/**
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   352
	 * Removes the given executables
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   353
	 * @param executables the array of executables to be removed
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   354
	 * @param monitor progress monitor
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   355
	 * @return IStatus of the operation
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   356
	 */
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   357
	public IStatus removeExecutables(Executable[] executables, IProgressMonitor monitor) {
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   358
		MultiStatus status = new MultiStatus(CDebugCorePlugin.PLUGIN_ID, IStatus.WARNING, "Couldn't remove all of the selected executables", null);
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   359
		
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   360
		monitor.beginTask("Remove Executables", executables.length);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   361
		for (Executable executable : executables) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   362
			
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   363
			IProjectExecutablesProvider provider = getExecutablesProviderForProject(executable.getProject());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   364
			if (provider != null) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   365
				IStatus result = provider.removeExecutable(executable, new SubProgressMonitor(monitor, 1));
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   366
				if (result.isOK()) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   367
					// remove the exe from the list
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   368
					List<Executable> exes = executablesMap.get(executable.getProject());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   369
					if (exes != null) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   370
						exes.remove(executable);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   371
					}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   372
				} else {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   373
					status.add(result);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   374
				}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   375
			}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   376
		}
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   377
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   378
		// notify listeners that the list has changed.  only do this if at least one delete succeeded.
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   379
		if (status.getChildren().length != executables.length) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   380
			synchronized (changeListeners) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   381
				for (IExecutablesChangeListener listener : changeListeners) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   382
					listener.executablesListChanged();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   383
				}
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   384
			}
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   385
		}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   386
		
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   387
		return status;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   388
	}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   389
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   390
	/**
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   391
	 * Refresh the list of executables for the given projects
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   392
	 * @param projects the list of projects, or null.  if null or the list
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   393
	 * is empty, all projects will be refreshed.
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   394
	 */
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   395
	public void refresh(List<IProject> projects) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   396
		if (projects == null || projects.size() == 0) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   397
			// clear the entire cache
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   398
			executablesMap.clear();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   399
		} else {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   400
			for (IProject project : projects) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   401
				executablesMap.remove(project);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   402
			}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   403
		}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   404
		
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   405
		scheduleRefresh();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   406
	}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   407
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   408
	public void resourceChanged(IResourceChangeEvent event) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   409
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   410
		synchronized (executablesMap) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   411
			// project needs to be refreshed after a build/clean as the binary may
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   412
			// be added/removed/renamed etc.
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   413
			if (event.getType() == IResourceChangeEvent.POST_BUILD) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   414
				Object obj = event.getSource();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   415
				if (obj != null && obj instanceof IProject) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   416
					if (executablesMap.containsKey(obj)) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   417
						List<Executable> executables = executablesMap.remove(obj);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   418
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   419
						trace("Scheduling refresh because project " + ((IProject)obj).getName() + " built or cleaned");
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   420
						
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   421
						scheduleRefresh();
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   422
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   423
						// notify the listeners that these executables have possibly changed
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   424
						if (executables != null && executables.size() > 0) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   425
							synchronized (changeListeners) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   426
								for (IExecutablesChangeListener listener : changeListeners) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   427
									listener.executablesChanged(executables);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   428
								}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   429
							}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   430
						}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   431
					}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   432
				}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   433
				return;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   434
			}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   435
			
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   436
			// refresh when projects are opened or closed. note that deleted
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   437
			// projects are handled later in this method. new projects are handled
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   438
			// in handleEvent.  resource changed events always start at the workspace
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   439
			// root, so projects are the next level down
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   440
			boolean refreshNeeded = false;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   441
			IResourceDelta[] projects = event.getDelta().getAffectedChildren();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   442
			for (IResourceDelta projectDelta : projects) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   443
				if ((projectDelta.getFlags() & IResourceDelta.OPEN) != 0) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   444
					if (projectDelta.getKind() == IResourceDelta.CHANGED) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   445
						// project was opened or closed
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   446
						if (executablesMap.containsKey(projectDelta.getResource())) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   447
							executablesMap.remove(projectDelta.getResource());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   448
						}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   449
						refreshNeeded = true;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   450
					}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   451
				}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   452
			}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   453
			
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   454
			if (refreshNeeded) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   455
				trace("Scheduling refresh because project(s) opened or closed");
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   456
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   457
				scheduleRefresh();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   458
				return;
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   459
			}
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   460
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   461
			try {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   462
				event.getDelta().accept(new IResourceDeltaVisitor() {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   463
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   464
					public boolean visit(IResourceDelta delta) throws CoreException {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   465
						if (delta.getKind() == IResourceDelta.ADDED || delta.getKind() == IResourceDelta.REMOVED) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   466
							IResource deltaResource = delta.getResource();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   467
							if (deltaResource != null) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   468
								boolean refresh = false;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   469
								if (delta.getKind() == IResourceDelta.REMOVED && deltaResource instanceof IProject) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   470
									// project deleted
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   471
									if (executablesMap.containsKey(deltaResource)) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   472
										executablesMap.remove(deltaResource);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   473
										refresh = true;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   474
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   475
										trace("Scheduling refresh because project " + deltaResource.getName() + " deleted");
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   476
									}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   477
								} else {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   478
									// see if a binary has been added/removed
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   479
									IPath resourcePath = deltaResource.getLocation();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   480
									if (resourcePath != null && Executable.isExecutableFile(resourcePath)) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   481
										if (executablesMap.containsKey(deltaResource.getProject())) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   482
											executablesMap.remove(deltaResource.getProject());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   483
											refresh = true;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   484
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   485
											trace("Scheduling refresh because a binary was added/removed");
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   486
										}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   487
									}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   488
								}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   489
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   490
								if (refresh) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   491
									scheduleRefresh();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   492
									return false;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   493
								}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   494
							}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   495
						}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   496
						return true;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   497
					}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   498
				});
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   499
			} catch (CoreException e) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   500
			}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   501
		}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   502
	}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   503
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   504
	public void handleEvent(CProjectDescriptionEvent event) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   505
		// this handles the cases where the active build configuration changes,
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   506
		// and when new projects are created or loaded at startup.
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   507
		boolean refresh = false;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   508
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   509
		int eventType = event.getEventType();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   510
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   511
		if (eventType == CProjectDescriptionEvent.DATA_APPLIED) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   512
			
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   513
			synchronized (executablesMap) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   514
				// see if the active build config has changed
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   515
				ICProjectDescription newDesc = event.getNewCProjectDescription();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   516
				ICProjectDescription oldDesc = event.getOldCProjectDescription();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   517
				if (oldDesc != null && newDesc != null) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   518
					String newConfigName = newDesc.getActiveConfiguration().getName();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   519
					String oldConfigName = oldDesc.getActiveConfiguration().getName();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   520
					if (!newConfigName.equals(oldConfigName)) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   521
						if (executablesMap.containsKey(newDesc.getProject())) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   522
							executablesMap.remove(newDesc.getProject());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   523
							refresh = true;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   524
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   525
							trace("Scheduling refresh because active build configuration changed");
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   526
						}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   527
					}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   528
				} else if (newDesc != null && oldDesc == null) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   529
					// project just created
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   530
					refresh = true;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   531
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   532
					trace("Scheduling refresh because project " + newDesc.getProject().getName() + " created");
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   533
				}
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   534
			}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   535
		}
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   536
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   537
		if (refresh) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   538
			scheduleRefresh();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   539
		}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   540
	}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   541
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   542
	private List<IProject> getProjectsToCheck() {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   543
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   544
		List<IProject> projects = new ArrayList<IProject>();
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   545
		
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   546
		synchronized (executablesMap) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   547
			// look for any CDT projects not in our cache
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   548
			for (IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   549
				if (!executablesMap.containsKey(project)) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   550
					if (CoreModel.hasCNature(project)) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   551
						projects.add(project);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   552
					}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   553
				}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   554
			}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   555
		}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   556
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   557
		return projects;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   558
	}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   559
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   560
	private void scheduleRefresh() {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   561
		trace("scheduleRefresh called at " + getStringFromTimestamp(System.currentTimeMillis()));
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   562
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   563
		refreshJob.cancel();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   564
		refreshJob.schedule();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   565
	}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   566
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   567
	private IProjectExecutablesProvider getExecutablesProviderForProject(IProject project) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   568
		IProjectExecutablesProvider provider = executablesProviderMap.get(project);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   569
		if (provider == null) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   570
			// not cached yet.  get the list of project natures from the providers and
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   571
			// pick the one with the closest match
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   572
			try {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   573
				IProjectDescription description = project.getDescription();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   574
				int mostNaturesMatched = 0;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   575
				for (IProjectExecutablesProvider exeProvider : executableProviders) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   576
					List<String> natures = exeProvider.getProjectNatures();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   577
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   578
					int naturesMatched = 0;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   579
					for (String nature : description.getNatureIds()) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   580
						if (natures.contains(nature)) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   581
							naturesMatched++;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   582
						}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   583
					}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   584
					
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   585
					if (naturesMatched > mostNaturesMatched) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   586
						provider = exeProvider;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   587
						mostNaturesMatched = naturesMatched;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   588
					}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   589
				}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   590
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   591
				// cache it
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   592
				executablesProviderMap.put(project, provider);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   593
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   594
			} catch (CoreException e) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   595
				e.printStackTrace();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   596
			}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   597
		}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   598
		
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   599
		return provider;
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   600
	}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   601
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   602
	private void loadExecutableProviderExtensions() {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   603
		executableProviders = Collections.synchronizedList(new ArrayList<IProjectExecutablesProvider>());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   604
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   605
		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   606
		IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(CDebugCorePlugin.PLUGIN_ID + ".ExecutablesProvider"); //$NON-NLS-1$
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   607
		IExtension[] extensions = extensionPoint.getExtensions();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   608
		
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   609
		for (int i = 0; i < extensions.length; i++) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   610
			IExtension extension = extensions[i];
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   611
			IConfigurationElement[] elements = extension.getConfigurationElements();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   612
			IConfigurationElement element = elements[0];
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   613
			
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   614
			boolean failed = false;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   615
			try {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   616
				Object extObject = element.createExecutableExtension("class"); //$NON-NLS-1$
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   617
				if (extObject instanceof IProjectExecutablesProvider) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   618
					executableProviders.add((IProjectExecutablesProvider)extObject);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   619
				} else {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   620
					failed = true;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   621
				}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   622
			} 
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   623
			catch (CoreException e) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   624
				failed = true;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   625
			}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   626
			
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   627
			if (failed) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   628
				CDebugCorePlugin.log("Unable to load ExecutablesProvider extension from " + extension.getContributor().getName());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   629
			}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   630
		}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   631
	}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   632
	
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   633
	private void loadSoureFileProviderExtensions() {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   634
		sourceFileProviders = Collections.synchronizedList(new ArrayList<ISourceFilesProvider>());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   635
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   636
		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   637
		IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(CDebugCorePlugin.PLUGIN_ID + ".SourceFilesProvider"); //$NON-NLS-1$
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   638
		IExtension[] extensions = extensionPoint.getExtensions();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   639
		
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   640
		for (int i = 0; i < extensions.length; i++) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   641
			IExtension extension = extensions[i];
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   642
			IConfigurationElement[] elements = extension.getConfigurationElements();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   643
			IConfigurationElement element = elements[0];
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   644
			
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   645
			boolean failed = false;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   646
			try {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   647
				Object extObject = element.createExecutableExtension("class"); //$NON-NLS-1$
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   648
				if (extObject instanceof ISourceFilesProvider) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   649
					sourceFileProviders.add((ISourceFilesProvider)extObject);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   650
				} else {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   651
					failed = true;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   652
				}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   653
			} 
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   654
			catch (CoreException e) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   655
				failed = true;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   656
			}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   657
			
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   658
			if (failed) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   659
				CDebugCorePlugin.log("Unable to load SourceFilesProvider extension from " + extension.getContributor().getName());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   660
			}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   661
		}
0
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   662
	}
0e6d23e2b466 DP tools release version Revision: 200912
Deepak Modgil <Deepak.Modgil@Nokia.com>
parents:
diff changeset
   663
14
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   664
	private void loadSoureRemappingExtensions() {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   665
		sourceFileRemappings = Collections.synchronizedList(new ArrayList<ISourceFileRemapping>());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   666
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   667
		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   668
		IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(CDebugCorePlugin.PLUGIN_ID + ".SourceRemappingProvider"); //$NON-NLS-1$
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   669
		IExtension[] extensions = extensionPoint.getExtensions();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   670
		
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   671
		for (int i = 0; i < extensions.length; i++) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   672
			IExtension extension = extensions[i];
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   673
			IConfigurationElement[] elements = extension.getConfigurationElements();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   674
			IConfigurationElement element = elements[0];
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   675
			
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   676
			boolean failed = false;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   677
			try {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   678
				Object extObject = element.createExecutableExtension("class"); //$NON-NLS-1$
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   679
				if (extObject instanceof ISourceFileRemapping) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   680
					sourceFileRemappings.add((ISourceFileRemapping)extObject);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   681
				} else {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   682
					failed = true;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   683
				}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   684
			} 
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   685
			catch (CoreException e) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   686
				failed = true;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   687
			}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   688
			
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   689
			if (failed) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   690
				CDebugCorePlugin.log("Unable to load SourceRemappingProvider extension from " + extension.getContributor().getName());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   691
			}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   692
		}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   693
	}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   694
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   695
	private void loadExecutableImporterExtensions() {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   696
		executableImporters = Collections.synchronizedList(new ArrayList<IExecutableImporter>());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   697
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   698
		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   699
		IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(CDebugCorePlugin.PLUGIN_ID + ".ExecutablesImporter"); //$NON-NLS-1$
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   700
		IExtension[] extensions = extensionPoint.getExtensions();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   701
		
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   702
		for (int i = 0; i < extensions.length; i++) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   703
			IExtension extension = extensions[i];
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   704
			IConfigurationElement[] elements = extension.getConfigurationElements();
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   705
			IConfigurationElement element = elements[0];
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   706
			
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   707
			boolean failed = false;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   708
			try {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   709
				Object extObject = element.createExecutableExtension("class"); //$NON-NLS-1$
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   710
				if (extObject instanceof IExecutableImporter) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   711
					executableImporters.add((IExecutableImporter)extObject);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   712
				} else {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   713
					failed = true;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   714
				}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   715
			} 
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   716
			catch (CoreException e) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   717
				failed = true;
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   718
			}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   719
			
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   720
			if (failed) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   721
				CDebugCorePlugin.log("Unable to load ExecutablesImporter extension from " + extension.getContributor().getName());
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   722
			}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   723
		}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   724
	}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   725
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   726
	private void trace(String msg) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   727
		if (DEBUG) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   728
			// TODO use Logger?
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   729
			System.out.println(msg);
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   730
		}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   731
	}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   732
	
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   733
	private String getStringFromTimestamp(long timestamp) {
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   734
		return DateFormat.getTimeInstance(DateFormat.MEDIUM).format(new Date(timestamp));
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   735
	}
c50c3d06898c executables view changes
wpaul
parents: 0
diff changeset
   736
}