1 21 22 package org.armedbear.j.jdb; 23 24 import com.sun.jdi.Location; 25 import com.sun.jdi.ReferenceType; 26 import com.sun.jdi.request.EventRequest; 27 import com.sun.jdi.request.EventRequestManager; 28 import java.util.List ; 29 import org.armedbear.j.Annotation; 30 import org.armedbear.j.Buffer; 31 import org.armedbear.j.Debug; 32 import org.armedbear.j.Editor; 33 import org.armedbear.j.File; 34 import org.armedbear.j.FastStringBuffer; 35 import org.armedbear.j.JavaSource; 36 import org.armedbear.j.Line; 37 import org.armedbear.j.Log; 38 import org.armedbear.j.Utilities; 39 40 public final class LineNumberBreakpoint extends ResolvableBreakpoint 41 { 42 private Buffer buffer; 43 private final int lineNumber; 44 45 public LineNumberBreakpoint(Jdb jdb, Buffer buffer, Line line) 46 { 47 super(jdb); 48 this.buffer = buffer; 49 this.line = line; 50 file = buffer.getFile(); 51 final String fileName = file.getName(); 52 String name = fileName.substring(0, fileName.length()-5); 53 String packageName = JavaSource.getPackageName(buffer); 54 if (packageName != null) 55 className = packageName.concat(".").concat(name); 56 else 57 className = name; 58 Log.debug("LineNumberBreakpoint className = |" + className + "|"); 59 lineNumber = line.lineNumber() + 1; 61 } 62 63 public LineNumberBreakpoint(Jdb jdb, String className, File file, 64 int lineNumber) 65 { 66 super(jdb); 67 this.className = className; 68 this.file = file; 69 this.lineNumber = lineNumber; 70 } 71 72 public int getLineNumber() 73 { 74 return lineNumber; 75 } 76 77 public EventRequest resolveEventRequest(ReferenceType refType) 78 throws Exception 79 { 80 Log.debug("LineNumberBreakpoint.resolveEventRequest"); 81 Location location = findLocation(refType, lineNumber); 82 if (location == null) { 83 Log.debug("resolveEventRequest location is null"); 84 return null; 85 } 86 EventRequestManager erm = 87 refType.virtualMachine().eventRequestManager(); 88 EventRequest er = erm.createBreakpointRequest(location); 89 er.setSuspendPolicy(EventRequest.SUSPEND_ALL); 90 er.enable(); 91 return er; 92 } 93 94 private Location findLocation(ReferenceType refType, int lineNumber) 95 throws Exception 96 { 97 Location location = null; 98 List locations = refType.locationsOfLine(lineNumber); 99 if (locations.size() > 0) { 100 location = (Location) locations.get(0); 101 if (location.method() != null) 102 return location; 103 } 104 return null; 105 } 106 107 public void resolved() 108 { 109 if (line != null) { 110 line.setAnnotation(new BreakpointAnnotation(this)); 111 } else { 112 Buffer buffer = Editor.getBufferList().findBuffer(file); 115 if (buffer != null) { 116 if (!buffer.initialized()) 117 buffer.initialize(); 118 if (!buffer.isLoaded()) 119 buffer.load(); 120 line = buffer.getLine(lineNumber - 1); 121 if (line != null) { 122 line.setAnnotation(new BreakpointAnnotation(this)); 123 buffer.repaint(); 124 } 125 } 126 } 127 if (buffer != null) 128 buffer.repaint(); 129 jdb.log("Breakpoint resolved: " + getLocationString()); 130 } 131 132 public String getLocationString() 133 { 134 FastStringBuffer sb = new FastStringBuffer(); 135 if (file != null) { 136 sb.append(file.getName()); 137 sb.append(':'); 138 } 139 sb.append(lineNumber); 140 if (!isResolved()) 141 sb.append(' '); 142 return sb.toString(); 143 } 144 145 public String toString() 146 { 147 FastStringBuffer sb = new FastStringBuffer(); 148 if (file != null) { 149 sb.append(file.getName()); 150 sb.append(':'); 151 } 152 sb.append(lineNumber); 153 if (!isResolved()) { 154 sb.append(' '); 155 sb.append("(deferred)"); 156 } 157 return sb.toString(); 158 } 159 160 public String toXml() 161 { 162 int indent = 4; 163 final String separator = System.getProperty("line.separator"); 164 FastStringBuffer sb = new FastStringBuffer(Utilities.spaces(indent)); 165 sb.append("<breakpoint"); 166 sb.append(separator); 167 if (className == null) 168 Debug.bug(); 169 if (className != null) { 170 sb.append(Utilities.spaces(indent+2)); 171 sb.append("className=\""); 172 sb.append(className); 173 sb.append('"'); 174 sb.append(separator); 175 } 176 if (file!= null) { 177 sb.append(Utilities.spaces(indent+2)); 178 sb.append("fileName=\""); 179 sb.append(file.canonicalPath()); 180 sb.append('"'); 181 sb.append(separator); 182 } 183 if (lineNumber > 0) { 184 sb.append(Utilities.spaces(indent+2)); 185 sb.append("lineNumber=\""); 186 sb.append(String.valueOf(lineNumber)); 187 sb.append('"'); 188 sb.append(separator); 189 } 190 sb.append(Utilities.spaces(indent)); 191 sb.append("/>"); 192 sb.append(separator); 193 return sb.toString(); 194 } 195 } 196 | Popular Tags |