Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDani Megert2015-12-09 20:22:11 +0000
committerDani Megert2015-12-09 20:22:11 +0000
commit5d1a8fc98d76253638e19c9848db7269c122c35b (patch)
tree09459b52b7f6a744aa584c56d97b6103bd03d429
parent9492fd701a0ffbf070019883034175fa1f12fc92 (diff)
downloadeclipse.jdt.debug-5d1a8fc98d76253638e19c9848db7269c122c35b.tar.gz
eclipse.jdt.debug-5d1a8fc98d76253638e19c9848db7269c122c35b.tar.xz
eclipse.jdt.debug-5d1a8fc98d76253638e19c9848db7269c122c35b.zip
-rw-r--r--org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIDebugTarget.java290
1 files changed, 4 insertions, 286 deletions
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIDebugTarget.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIDebugTarget.java
index 82ff69f31..6caa0cc03 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIDebugTarget.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIDebugTarget.java
@@ -8,37 +8,26 @@
* Contributors:
* IBM Corporation - initial API and implementation
* Jesper Steen Moller - enhancement 254677 - filter getters/setters
- * Andrey Loskutov <loskutov@gmx.de> - bug 5188 - breakpoint filtering
*******************************************************************************/
package org.eclipse.jdt.internal.debug.core.model;
import java.io.IOException;
-import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
-import java.util.LinkedHashSet;
import java.util.List;
-import java.util.Map;
import java.util.Set;
-import java.util.concurrent.atomic.AtomicReference;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
+
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
@@ -51,7 +40,6 @@ import org.eclipse.debug.core.IBreakpointManager;
import org.eclipse.debug.core.IBreakpointManagerListener;
import org.eclipse.debug.core.IDebugEventSetListener;
import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchListener;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.IDebugElement;
@@ -67,19 +55,9 @@ import org.eclipse.debug.core.model.IThread;
import org.eclipse.jdi.TimeoutException;
import org.eclipse.jdi.internal.VirtualMachineImpl;
import org.eclipse.jdi.internal.jdwp.JdwpReplyPacket;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaElement;
+
import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.SearchEngine;
-import org.eclipse.jdt.core.search.SearchPattern;
-import org.eclipse.jdt.core.search.TypeNameMatch;
-import org.eclipse.jdt.core.search.TypeNameMatchRequestor;
+
import org.eclipse.jdt.debug.core.IJavaBreakpoint;
import org.eclipse.jdt.debug.core.IJavaDebugTarget;
import org.eclipse.jdt.debug.core.IJavaHotCodeReplaceListener;
@@ -303,21 +281,6 @@ public class JDIDebugTarget extends JDIDebugElement implements
private ListenerList fHCRListeners = new ListenerList();
/**
- * Java scope of the current launch, "null" means everything is in scope
- */
- private IJavaSearchScope fScope;
-
- /**
- * Java projects of the current launch, "null" means everything is in scope
- */
- private Set<IProject> fProjects;
-
- /**
- * Java types from breakpoints with the flag if they are in scope for current launch
- */
- private Map<String, Boolean> fKnownTypes = new HashMap<>();
-
- /**
* Creates a new JDI debug target for the given virtual machine.
*
* @param jvm
@@ -353,7 +316,6 @@ public class JDIDebugTarget extends JDIDebugElement implements
setTerminating(false);
setDisconnected(false);
setName(name);
- prepareBreakpointsSearchScope();
setBreakpoints(new ArrayList<IBreakpoint>(5));
setThreadList(new ArrayList<JDIThread>(5));
fGroups = new ArrayList<JDIThreadGroup>(5);
@@ -365,32 +327,6 @@ public class JDIDebugTarget extends JDIDebugElement implements
.addBreakpointManagerListener(this);
}
- private void prepareBreakpointsSearchScope() {
- ILaunchConfiguration config = getLaunch().getLaunchConfiguration();
- if (config == null) {
- return;
- }
- try {
- IResource[] resources = config.getMappedResources();
- if (resources != null && resources.length != 0) {
- Set<IJavaProject> javaProjects = getJavaProjects(resources);
- fProjects = collectReferencedJavaProjects(javaProjects);
- fScope = SearchEngine.createJavaSearchScope(javaProjects.toArray(new IJavaProject[javaProjects.size()]), true);
- return;
- }
- // See IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME
- String projectName = config.getAttribute("org.eclipse.jdt.launching.PROJECT_ATTR", (String)null); //$NON-NLS-1$
- if(projectName != null){
- Set<IJavaProject> javaProjects = getJavaProjects(ResourcesPlugin.getWorkspace().getRoot().getProject(projectName));
- fProjects = collectReferencedJavaProjects(javaProjects);
- fScope = SearchEngine.createJavaSearchScope(javaProjects.toArray(new IJavaProject[javaProjects.size()]), true);
- return;
- }
- } catch (CoreException e) {
- logError(e);
- }
- }
-
/**
* Returns the event dispatcher for this debug target. There is one event
* dispatcher per debug target.
@@ -1350,222 +1286,7 @@ public class JDIDebugTarget extends JDIDebugElement implements
*/
@Override
public boolean supportsBreakpoint(IBreakpoint breakpoint) {
- boolean isJava = breakpoint instanceof IJavaBreakpoint;
- if(!isJava){
- return false;
- }
- if(fScope == null){
- // no checks, everything in scope: the filtering is disabled
- return true;
- }
-
- IJavaBreakpoint jBreakpoint = (IJavaBreakpoint) breakpoint;
-
- // check if the breakpoint from resources in target scope
- IMarker marker = jBreakpoint.getMarker();
- if(marker != null){
- IResource resource = marker.getResource();
- // Java exception breakpoints have wsp root as resource
- if(resource != null && resource != ResourcesPlugin.getWorkspace().getRoot()){
- if (fProjects.contains(resource.getProject())) {
- return true;
- }
- // check if this is a resource which is linked to any of the projects
- IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
- URI uri = resource.getLocationURI();
- if(uri != null){
- IFile[] files = root.findFilesForLocationURI(uri);
- for (IFile file : files) {
- if(fProjects.contains(file.getProject())){
- return true;
- }
- }
- }
- // breakpoint belongs to resource outside of referenced projects?
- return false;
- }
- }
-
- // Marker not available, so try to find the type in our scope
- try {
- String typeName = jBreakpoint.getTypeName();
- if(typeName != null){
- Boolean known = fKnownTypes.get(typeName);
- if(known != null){
- return known.booleanValue();
- }
- boolean inScope = isTypeAccessibleInScope(typeName);
- fKnownTypes.put(typeName, Boolean.valueOf(inScope));
- return inScope;
- }
- } catch (CoreException e) {
- logError(e);
- }
-
- // no idea what this breakpoint about, so let say we support it
- return true;
- }
-
- private Set<IJavaProject> getJavaProjects(IResource... resources) {
- Set<IJavaProject> projects = new LinkedHashSet<>();
- for (IResource resource : resources) {
- IProject project = resource.getProject();
- if(!project.isAccessible()){
- continue;
- }
- IJavaElement javaElement = JavaCore.create(project);
- if(javaElement != null) {
- projects.add(javaElement.getJavaProject());
- }
- }
- return projects;
- }
-
- /**
- * @param javaProjects the set which will be updated with all referenced java projects
- * @return corresponding resource projects
- */
- private Set<IProject> collectReferencedJavaProjects(Set<IJavaProject> javaProjects) {
- Set<IProject> projects = new LinkedHashSet<>();
- // collect all references
- for (IJavaProject jProject : javaProjects) {
- projects.add(jProject.getProject());
- addReferencedProjects(jProject, projects);
- }
- // update java projects set with new java projects we might collected
- for (IProject project : projects) {
- IJavaProject jProject = JavaCore.create(project);
- if(jProject != null){
- javaProjects.add(jProject);
- }
- }
- return projects;
- }
-
- private void addReferencedProjects(IJavaProject jProject, Set<IProject> projects) {
- IClasspathEntry[] cp;
- try {
- // we want resolved classpath to get variables and containers resolved for us
- cp = jProject.getResolvedClasspath(true);
- } catch (JavaModelException e) {
- // we don't care here
- return;
- }
- for (IClasspathEntry cpe : cp) {
- int entryKind = cpe.getEntryKind();
- IProject project = null;
- switch (entryKind) {
- case IClasspathEntry.CPE_LIBRARY:
- // we must check for external folders coming from other projects in the workspace
- project = getProjectOfExternalFolder(cpe);
- break;
- case IClasspathEntry.CPE_PROJECT:
- // we must add any projects referenced
- project = getProject(cpe);
- break;
- case IClasspathEntry.CPE_SOURCE:
- // we have the project already
- case IClasspathEntry.CPE_VARIABLE:
- // should not happen on resolved classpath
- case IClasspathEntry.CPE_CONTAINER:
- // should not happen on resolved classpath
- default:
- break;
- }
-
- if(project == null || projects.contains(project) || !project.isAccessible()){
- continue;
- }
-
- IJavaProject referenced = JavaCore.create(project);
- if (referenced != null) {
- // we have found new project, start recursion
- projects.add(project);
- addReferencedProjects(referenced, projects);
- }
- }
- }
-
- private IProject getProject(IClasspathEntry cpe) {
- IPath projectPath = cpe.getPath();
- if (projectPath == null || projectPath.isEmpty()) {
- return null;
- }
- IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
- IProject project = root.getProject(projectPath.lastSegment());
- if (project.isAccessible()) {
- return project;
- }
- return null;
- }
-
- private static IProject getProjectOfExternalFolder(IClasspathEntry cpe){
- IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
- if(cpe.getContentKind() == IPackageFragmentRoot.K_BINARY){
- IPath path = cpe.getPath();
- if(path == null || path.isEmpty()){
- return null;
- }
- IProject project = root.getProject(path.segment(0));
- if(project.isAccessible()) {
- return project;
- }
- }
- return null;
- }
-
- /*
- * Checks if the given type is accessible in our scope
- */
- private boolean isTypeAccessibleInScope(final String typeName) {
- final AtomicReference<IType> foundType = new AtomicReference<>();
- String packageName = null;
- String simpleName = typeName;
- int lastDot = typeName.lastIndexOf('.');
- if(lastDot > 0 && lastDot < typeName.length() - 1){
- packageName = typeName.substring(0, lastDot);
- simpleName = typeName.substring(lastDot + 1);
- }
- // get rid of inner types, use outer type name
- final String fqName;
- int firstDoll = simpleName.indexOf('$');
- if(firstDoll > 0 && firstDoll < simpleName.length() - 1){
- simpleName = simpleName.substring(0, firstDoll);
- fqName = packageName + "." + simpleName; //$NON-NLS-1$
- } else {
- fqName = typeName;
- }
-
- final IProgressMonitor monitor = new NullProgressMonitor();
- TypeNameMatchRequestor requestor = new TypeNameMatchRequestor() {
- @Override
- public void acceptTypeNameMatch(TypeNameMatch match) {
- IType type = match.getType();
- if(fqName.equals(type.getFullyQualifiedName())){
- foundType.set(type);
- monitor.setCanceled(true);
- return;
- }
- }
- };
- try {
- SearchEngine searchEngine = new SearchEngine();
- searchEngine.searchAllTypeNames(packageName != null? packageName.toCharArray() : null,
- SearchPattern.R_EXACT_MATCH | SearchPattern.R_CASE_SENSITIVE,
- simpleName.toCharArray(),
- SearchPattern.R_EXACT_MATCH | SearchPattern.R_CASE_SENSITIVE,
- IJavaSearchConstants.TYPE,
- fScope,
- requestor,
- IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,
- monitor);
- } catch (JavaModelException e) {
- logError(e);
- return true;
- } catch (OperationCanceledException e){
- // expected if we cancelled the search on first match
- }
- return foundType.get() != null;
+ return breakpoint instanceof IJavaBreakpoint;
}
/**
@@ -1846,9 +1567,6 @@ public class JDIDebugTarget extends JDIDebugElement implements
setEventDispatcher(null);
setStepFilters(new String[0]);
fHCRListeners.clear();
- fKnownTypes.clear();
- fProjects = null;
- fScope = null;
}
/**

Back to the top