1 11 package org.eclipse.jdt.internal.debug.core.model; 12 13 import org.eclipse.debug.core.DebugException; 14 import org.eclipse.debug.core.model.IIndexedValue; 15 import org.eclipse.debug.core.model.IVariable; 16 import org.eclipse.jdt.debug.core.IJavaObject; 17 import org.eclipse.jdt.debug.core.IJavaType; 18 import org.eclipse.jdt.debug.core.IJavaVariable; 19 import org.eclipse.jdt.internal.debug.core.HeapWalkingManager; 20 import org.eclipse.jdt.internal.debug.core.JDIDebugPlugin; 21 import org.eclipse.jdt.internal.debug.core.logicalstructures.JDIPlaceholderVariable; 22 23 import com.ibm.icu.text.MessageFormat; 24 import com.sun.jdi.ObjectReference; 25 26 38 public class JDIReferenceListValue extends JDIObjectValue implements IIndexedValue { 39 40 private IJavaObject fRoot; 41 private boolean fIsMoreThanPreference; 42 43 48 public JDIReferenceListValue(IJavaObject root) { 49 super((JDIDebugTarget)root.getDebugTarget(), ((JDIObjectValue)root).getUnderlyingObject()); 50 fRoot = root; 51 } 52 53 56 protected synchronized IJavaObject[] getReferences(){ 57 try{ 58 int max = HeapWalkingManager.getDefault().getAllReferencesMaxCount(); 59 IJavaObject[] referringObjects = null; 60 fIsMoreThanPreference = false; 61 if (max == 0){ 62 referringObjects = fRoot.getReferringObjects(max); 63 } else { 64 referringObjects = fRoot.getReferringObjects(max+1); 65 if (referringObjects.length > max){ 66 fIsMoreThanPreference = true; 67 referringObjects[max] = new JDIPlaceholderValue((JDIDebugTarget)fRoot.getDebugTarget(),MessageFormat.format(JDIDebugModelMessages.JDIReferenceListValue_9,new String []{Integer.toString(max)})); 68 } 69 } 70 return referringObjects; 71 } catch (DebugException e) { 72 JDIDebugPlugin.log(e); 73 return new IJavaObject[0]; 74 } 75 } 76 77 80 protected synchronized boolean referencesLoaded(){ 81 if (fRoot instanceof JDIObjectValue){ 82 return ((JDIObjectValue)fRoot).isReferencesLoaded(); 83 } 84 return false; 85 } 86 87 90 public IVariable[] getVariables() throws DebugException { 91 IJavaObject[] elements = getReferences(); 92 IVariable[] vars = new JDIPlaceholderVariable[elements.length]; 93 int length = elements.length; 94 if(fIsMoreThanPreference){ 95 length--; 96 vars[length] = new JDIPlaceholderVariable(JDIDebugModelMessages.JDIReferenceListValue_11, elements[length]); 97 } 98 99 for (int i = 0; i < length; i++) { 100 vars[i] = new JDIReferenceListEntryVariable(MessageFormat.format(JDIDebugModelMessages.JDIReferenceListValue_0, new String []{Integer.toString(i)}),elements[i]); 101 } 102 return vars; 103 } 104 105 108 public ObjectReference getUnderlyingObject() { 109 return null; 110 } 111 112 115 public boolean hasVariables() throws DebugException { 116 if (referencesLoaded()){ 117 return getReferences().length > 0; 118 } 119 return true; 120 } 121 122 125 public boolean isAllocated() throws DebugException { 126 return fRoot.isAllocated(); 127 } 128 129 132 public IJavaType getJavaType() throws DebugException { 133 IJavaType[] javaTypes = getJavaDebugTarget().getJavaTypes(getReferenceTypeName()); 134 if (javaTypes.length > 0) { 135 return javaTypes[0]; 136 } 137 return null; 138 } 139 140 143 public String getSignature() throws DebugException { 144 return "[Ljava/lang/Object;"; } 146 147 150 public String getReferenceTypeName() throws DebugException { 151 return "java.lang.Object[]"; } 153 154 157 public String getValueString() throws DebugException { 158 return ""; } 160 161 167 public String getDetailString(){ 168 StringBuffer buf = new StringBuffer (); 169 Object [] elements = getReferences(); 170 if (elements.length == 0){ 171 buf.append(JDIDebugModelMessages.JDIReferenceListValue_2); 172 } 173 else{ 174 String length = null; 175 if (fIsMoreThanPreference){ 176 length = MessageFormat.format(JDIDebugModelMessages.JDIReferenceListValue_15,new String []{Integer.toString(elements.length-1)}); 177 } else { 178 length = Integer.toString(elements.length); 179 } 180 if (elements.length == 1){ 181 buf.append(MessageFormat.format(JDIDebugModelMessages.JDIReferenceListValue_3,new String []{length})); 182 } else { 183 buf.append(MessageFormat.format(JDIDebugModelMessages.JDIReferenceListValue_4,new String []{length})); 184 } 185 for (int i = 0; i < elements.length; i++) { 186 buf.append(elements[i] + "\n"); } 188 } 189 return buf.toString(); 190 } 191 192 195 public String toString() { 196 return MessageFormat.format(JDIDebugModelMessages.JDIReferenceListValue_6,new String []{getUnderlyingValue().toString()}); 197 } 198 199 202 public boolean equals(Object o) { 203 if (o instanceof JDIReferenceListValue) { 205 JDIReferenceListValue ref = (JDIReferenceListValue) o; 206 return ref.fRoot.equals(fRoot); 207 } 208 return false; 209 } 210 211 214 public int hashCode() { 215 return getClass().hashCode() + fRoot.hashCode(); 216 } 217 218 221 public int getInitialOffset() { 222 return 0; 223 } 224 225 228 public int getSize() throws DebugException { 229 return getVariables().length; 230 } 231 232 235 public IVariable getVariable(int offset) throws DebugException { 236 IVariable[] variables = getVariables(); 237 if (offset < variables.length) { 238 return variables[offset]; 239 } else { 240 requestFailed(JDIDebugModelMessages.JDIReferenceListValue_7, new IndexOutOfBoundsException ()); 241 return null; 242 } 243 } 244 245 248 public IVariable[] getVariables(int offset, int length) throws DebugException { 249 IVariable[] variables = getVariables(); 250 if (offset < variables.length && (offset + length) <= variables.length) { 251 IJavaVariable[] vars = new IJavaVariable[length]; 252 System.arraycopy(variables, offset, vars, 0, length); 253 return vars; 254 } else { 255 requestFailed(JDIDebugModelMessages.JDIReferenceListValue_8, new IndexOutOfBoundsException ()); 256 return null; 257 } 258 } 259 260 } 261 | Popular Tags |