1 7 34 35 package com.sun.tools.example.debug.tty; 36 37 import com.sun.jdi.*; 38 import com.sun.jdi.request.EventRequest; 39 import com.sun.jdi.request.ExceptionRequest; 40 import com.sun.jdi.request.ClassPrepareRequest; 41 import com.sun.jdi.event.ClassPrepareEvent; 42 import java.util.List ; 43 import java.util.ArrayList ; 44 import java.util.Iterator ; 45 46 abstract class EventRequestSpec { 47 48 final ReferenceTypeSpec refSpec; 49 50 int suspendPolicy = EventRequest.SUSPEND_ALL; 51 52 EventRequest resolved = null; 53 ClassPrepareRequest prepareRequest = null; 54 55 EventRequestSpec(ReferenceTypeSpec refSpec) { 56 this.refSpec = refSpec; 57 } 58 59 62 abstract EventRequest resolveEventRequest(ReferenceType refType) 63 throws Exception ; 64 65 70 synchronized EventRequest resolve(ClassPrepareEvent event) throws Exception { 71 if ((resolved == null) && 72 (prepareRequest != null) && 73 prepareRequest.equals(event.request())) { 74 75 resolved = resolveEventRequest(event.referenceType()); 76 prepareRequest.disable(); 77 Env.vm().eventRequestManager().deleteEventRequest(prepareRequest); 78 prepareRequest = null; 79 80 if (refSpec instanceof PatternReferenceTypeSpec) { 81 PatternReferenceTypeSpec prs = (PatternReferenceTypeSpec)refSpec; 82 if (! prs.isUnique()){ 83 90 resolved = null; 91 prepareRequest = refSpec.createPrepareRequest(); 92 prepareRequest.enable(); 93 } 94 } 95 } 96 return resolved; 97 } 98 99 synchronized void remove() { 100 if (isResolved()) { 101 Env.vm().eventRequestManager().deleteEventRequest(resolved()); 102 } 103 if (refSpec instanceof PatternReferenceTypeSpec) { 104 PatternReferenceTypeSpec prs = (PatternReferenceTypeSpec)refSpec; 105 if (! prs.isUnique()){ 106 112 ArrayList deleteList = new ArrayList (); 113 Iterator iter = 114 Env.vm().eventRequestManager().exceptionRequests().iterator(); 115 while (iter.hasNext()) { 116 ExceptionRequest er = (ExceptionRequest)iter.next(); 117 if (prs.matches(er.exception())) { 118 deleteList.add (er); 119 } 120 } 121 Env.vm().eventRequestManager().deleteEventRequests(deleteList); 122 } 123 } 124 } 125 126 private EventRequest resolveAgainstPreparedClasses() throws Exception { 127 Iterator iter = Env.vm().allClasses().iterator(); 128 while (iter.hasNext()) { 129 ReferenceType refType = (ReferenceType)iter.next(); 130 if (refType.isPrepared() && refSpec.matches(refType)) { 131 resolved = resolveEventRequest(refType); 132 } 133 } 134 return resolved; 135 } 136 137 synchronized EventRequest resolveEagerly() throws Exception { 138 try { 139 if (resolved == null) { 140 144 prepareRequest = refSpec.createPrepareRequest(); 145 prepareRequest.enable(); 146 147 resolveAgainstPreparedClasses(); 149 if (resolved != null) { 150 prepareRequest.disable(); 151 Env.vm().eventRequestManager().deleteEventRequest(prepareRequest); 152 prepareRequest = null; 153 } 154 } 155 if (refSpec instanceof PatternReferenceTypeSpec) { 156 PatternReferenceTypeSpec prs = (PatternReferenceTypeSpec)refSpec; 157 if (! prs.isUnique()){ 158 165 resolved = null; 166 if (prepareRequest == null) { 167 prepareRequest = refSpec.createPrepareRequest(); 168 prepareRequest.enable(); 169 } 170 } 171 } 172 } catch (VMNotConnectedException e) { 173 } 176 return resolved; 177 } 178 179 183 EventRequest resolved() { 184 return resolved; 185 } 186 187 190 boolean isResolved() { 191 return resolved != null; 192 } 193 194 protected boolean isJavaIdentifier(String s) { 195 if (s.length() == 0) { 196 return false; 197 } 198 199 int cp = s.codePointAt(0); 200 if (! Character.isJavaIdentifierStart(cp)) { 201 return false; 202 } 203 204 for (int i = Character.charCount(cp); i < s.length(); i += Character.charCount(cp)) { 205 cp = s.codePointAt(i); 206 if (! Character.isJavaIdentifierPart(cp)) { 207 return false; 208 } 209 } 210 211 return true; 212 } 213 214 String errorMessageFor(Exception e) { 215 if (e instanceof IllegalArgumentException ) { 216 return (MessageOutput.format("Invalid command syntax")); 217 } else if (e instanceof RuntimeException ) { 218 throw (RuntimeException )e; 220 } else { 221 return (MessageOutput.format("Internal error; unable to set", 222 this.refSpec.toString())); 223 } 224 } 225 } 226 227 228 | Popular Tags |