|
What this is
Other links
The source code
/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Micro//S ystems, Inc. Portions Copyright 1997-2001 Sun
* Micro//S ystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.debugger.jpda;
import com.sun.jdi.AbsentInformationException;
import com.sun.jdi.StackFrame;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.netbeans.spi.debugger.ContextProvider;
import org.netbeans.api.debugger.jpda.CallStackFrame;
import org.netbeans.api.debugger.jpda.Field;
import org.netbeans.api.debugger.jpda.JPDADebugger;
import org.netbeans.api.debugger.jpda.JPDAThread;
import org.netbeans.api.debugger.jpda.LineBreakpoint;
import org.netbeans.api.debugger.jpda.LocalVariable;
import org.netbeans.api.debugger.jpda.Variable;
import org.netbeans.spi.debugger.jpda.SourcePathProvider;
import org.netbeans.spi.debugger.jpda.EditorContext;
import org.netbeans.spi.viewmodel.NoInformationException;
/**
*
* @author Jan Jancura
*/
public class SourcePath {
private ContextProvider lookupProvider;
private SourcePathProvider contextProvider;
private JPDADebugger debugger;
public SourcePath (ContextProvider lookupProvider) {
this.lookupProvider = lookupProvider;
debugger = (JPDADebugger) lookupProvider.lookupFirst
(null, JPDADebugger.class);
}
private SourcePathProvider getContext () {
if (contextProvider == null) {
List l = lookupProvider.lookup (null, SourcePathProvider.class);
contextProvider = (SourcePathProvider) l.get (0);
int i, k = l.size ();
for (i = 1; i < k; i++) {
contextProvider = new CompoundContextProvider (
(SourcePathProvider) l.get (i),
contextProvider
);
}
}
return contextProvider;
}
// ContextProvider methods .................................................
/**
* Returns relative path for given url.
*
* @param url a url of resource file
* @param directorySeparator a directory separator character
* @param includeExtension whether the file extension should be included
* in the result
*
* @return relative path
*/
public String getRelativePath (
String url,
char directorySeparator,
boolean includeExtension
) {
return getContext ().getRelativePath
(url, directorySeparator, includeExtension);
}
/**
* Translates a relative path (java/lang/Thread.java) to url.
*
* @param relativePath a relative path (java/lang/Thread.java)
* @return url
*/
public String getURL (String relativePath) {
return getContext ().getURL (relativePath);
}
public String getURL (
StackFrame sf,
String stratumn
) {
try {
return getURL (
convertSlash (sf.location ().sourcePath (stratumn))
);
} catch (AbsentInformationException e) {
return getURL (convertClassNameToRelativePath (
sf.location ().declaringType ().name ()
));
}
}
/**
* Returns array of source roots.
*/
public String[] getSourceRoots () {
return getContext ().getSourceRoots ();
}
/**
* Sets array of source roots.
*
* @param sourceRoots a new array of sourceRoots
*/
public void setSourceRoots (String[] sourceRoots) {
getContext ().setSourceRoots (sourceRoots);
}
/**
* Returns set of original source roots.
*
* @return set of original source roots
*/
public String[] getOriginalSourceRoots () {
return getContext ().getOriginalSourceRoots ();
}
/**
* Adds property change listener.
*
* @param l new listener.
*/
public void addPropertyChangeListener (PropertyChangeListener l) {
getContext ().addPropertyChangeListener (l);
}
/**
* Removes property change listener.
*
* @param l removed listener.
*/
public void removePropertyChangeListener (
PropertyChangeListener l
) {
getContext ().removePropertyChangeListener (l);
}
// utility methods .........................................................
public boolean sourceAvailable (
String relativePath
) {
return getURL (relativePath) != null;
}
public boolean sourceAvailable (
JPDAThread t,
String stratumn
) {
try {
return sourceAvailable (convertSlash (t.getSourcePath (stratumn)));
} catch (NoInformationException e) {
return sourceAvailable (convertClassNameToRelativePath (t.getClassName ()));
}
}
public boolean sourceAvailable (
Field f
) {
String className = f.getClassName ();
return sourceAvailable (className);
}
public boolean sourceAvailable (
CallStackFrame csf,
String stratumn
) {
try {
return sourceAvailable (convertSlash (csf.getSourcePath (stratumn)));
} catch (NoInformationException e) {
return sourceAvailable (convertClassNameToRelativePath (csf.getClassName ()));
}
}
public String getURL (
CallStackFrame csf,
String stratumn
) {
try {
return getURL (convertSlash (csf.getSourcePath (stratumn)));
} catch (NoInformationException e) {
return getURL (convertClassNameToRelativePath (csf.getClassName ()));
}
}
public boolean showSource (
JPDAThread t,
String stratumn
) {
int lineNumber = t.getLineNumber (stratumn);
if (lineNumber < 1) lineNumber = 1;
try {
return EditorContextBridge.showSource (
getURL (convertSlash (t.getSourcePath (stratumn))),
lineNumber,
debugger
);
} catch (NoInformationException e) {
return EditorContextBridge.showSource (
getURL (convertClassNameToRelativePath (t.getClassName ())),
lineNumber,
debugger
);
}
}
public boolean showSource (CallStackFrame csf, String stratumn) {
int lineNumber = csf.getLineNumber (stratumn);
if (lineNumber < 1) lineNumber = 1;
try {
return EditorContextBridge.showSource (
getURL (convertSlash (csf.getSourcePath (stratumn))),
lineNumber,
debugger
);
} catch (NoInformationException e) {
return EditorContextBridge.showSource (
getURL (convertClassNameToRelativePath (csf.getClassName ())),
lineNumber,
debugger
);
}
}
public boolean showSource (Field v) {
String fieldName = ((Field) v).getName ();
String className = className = ((Field) v).getClassName ();
String url = getURL (EditorContextBridge.getRelativePath (className));
if (url == null) return false;
int lineNumber = lineNumber = EditorContextBridge.getFieldLineNumber (
url,
className,
fieldName
);
if (lineNumber < 1) lineNumber = 1;
return EditorContextBridge.showSource (
url,
lineNumber,
debugger
);
}
private static String convertSlash (String original) {
return original.replace (File.separatorChar, '/');
}
public static String convertClassNameToRelativePath (
String className
) {
int i = className.indexOf ('$');
if (i > 0) className = className.substring (0, i);
String sourceName = className.replace
('.', '/') + ".java";
return sourceName;
}
public Object annotate (
JPDAThread t,
String stratumn
) {
int lineNumber = t.getLineNumber (stratumn);
if (lineNumber < 1) return null;
try {
return EditorContextBridge.annotate (
getURL (convertSlash (t.getSourcePath (stratumn))),
lineNumber,
EditorContext.CURRENT_LINE_ANNOTATION_TYPE,
debugger
);
} catch (NoInformationException e) {
return EditorContextBridge.annotate (
getURL (convertClassNameToRelativePath (t.getClassName ())),
lineNumber,
EditorContext.CURRENT_LINE_ANNOTATION_TYPE,
debugger
);
}
}
public Object annotate (
CallStackFrame csf,
String stratumn
) {
int lineNumber = csf.getLineNumber (stratumn);
if (lineNumber < 1) return null;
try {
return EditorContextBridge.annotate (
getURL (convertSlash (csf.getSourcePath (stratumn))),
lineNumber,
EditorContext.CALL_STACK_FRAME_ANNOTATION_TYPE,
debugger
);
} catch (NoInformationException e) {
return EditorContextBridge.annotate (
getURL (convertClassNameToRelativePath (csf.getClassName ())),
lineNumber,
EditorContext.CALL_STACK_FRAME_ANNOTATION_TYPE,
debugger
);
}
}
// innerclasses ............................................................
private static class CompoundContextProvider extends SourcePathProvider {
private SourcePathProvider cp1, cp2;
CompoundContextProvider (
SourcePathProvider cp1,
SourcePathProvider cp2
) {
this.cp1 = cp1;
this.cp2 = cp2;
}
public String getURL (String relativePath) {
String p1 = cp1.getURL (relativePath);
if (p1 != null) return p1;
return cp2.getURL (relativePath);
}
public String getRelativePath (
String url,
char directorySeparator,
boolean includeExtension
) {
String p1 = cp1.getRelativePath (
url,
directorySeparator,
includeExtension
);
if (p1 != null) return p1;
return cp2.getRelativePath (
url,
directorySeparator,
includeExtension
);
}
public String[] getSourceRoots () {
String[] fs1 = cp1.getSourceRoots ();
String[] fs2 = cp2.getSourceRoots ();
String[] fs = new String [fs1.length + fs2.length];
System.arraycopy (fs1, 0, fs, 0, fs1.length);
System.arraycopy (fs2, 0, fs, fs1.length, fs2.length);
return fs;
}
public String[] getOriginalSourceRoots () {
String[] fs1 = cp1.getOriginalSourceRoots ();
String[] fs2 = cp2.getOriginalSourceRoots ();
String[] fs = new String [fs1.length + fs2.length];
System.arraycopy (fs1, 0, fs, 0, fs1.length);
System.arraycopy (fs2, 0, fs, fs1.length, fs2.length);
return fs;
}
public void setSourceRoots (String[] sourceRoots) {
cp1.setSourceRoots (sourceRoots);
cp2.setSourceRoots (sourceRoots);
}
public void addPropertyChangeListener (PropertyChangeListener l) {
cp1.addPropertyChangeListener (l);
cp2.addPropertyChangeListener (l);
}
public void removePropertyChangeListener (PropertyChangeListener l) {
cp1.removePropertyChangeListener (l);
cp2.removePropertyChangeListener (l);
}
}
private static class CompoundAnnotation {
Object annotation1;
Object annotation2;
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.