1 16 package com.google.gwt.dev.shell; 17 18 import java.util.Iterator ; 19 import java.util.Vector ; 20 21 32 public abstract class JsValue { 33 34 37 protected interface JsCleanup { 38 void doCleanup(); 39 } 40 41 44 private static Thread theOnlyThreadAllowed; 45 46 49 private static Vector toBeReleased = new Vector (); 50 51 private static final Object toBeReleasedLock = new Object (); 52 53 57 public static void mainThreadCleanup() { 58 checkThread(); 59 Vector temp; 60 synchronized (toBeReleasedLock) { 61 temp = toBeReleased; 62 toBeReleased = new Vector (); 63 } 64 for (Iterator iter = temp.iterator(); iter.hasNext();) { 65 JsCleanup cleanup = (JsCleanup) iter.next(); 66 cleanup.doCleanup(); 67 } 68 temp.clear(); 69 } 70 71 74 private static synchronized void checkThread() { 75 if (theOnlyThreadAllowed == null) { 76 theOnlyThreadAllowed = Thread.currentThread(); 77 } else if (theOnlyThreadAllowed != Thread.currentThread()) { 78 throw new RuntimeException ("This object has permanent thread affinity."); 79 } 80 } 81 82 85 private static void queueCleanup(JsCleanup cleanup) { 86 synchronized (toBeReleasedLock) { 89 toBeReleased.add(cleanup); 90 } 91 } 92 93 99 public abstract boolean getBoolean(); 100 101 107 public abstract int getInt(); 108 109 115 public abstract double getNumber(); 116 117 124 public abstract String getString(); 125 126 131 public abstract String getTypeString(); 132 133 138 public abstract Object getWrappedJavaObject(); 139 140 143 public abstract boolean isBoolean(); 144 145 148 public abstract boolean isInt(); 149 150 153 public abstract boolean isJavaScriptObject(); 154 155 158 public abstract boolean isNull(); 159 160 163 public abstract boolean isNumber(); 164 165 168 public abstract boolean isString(); 169 170 173 public abstract boolean isUndefined(); 174 175 178 public abstract boolean isWrappedJavaObject(); 179 180 185 public abstract void setBoolean(boolean val); 186 187 192 public abstract void setByte(byte val); 193 194 199 public abstract void setChar(char val); 200 201 206 public abstract void setDouble(double val); 207 208 213 public abstract void setInt(int val); 214 215 220 public abstract void setNull(); 221 222 227 public abstract void setShort(short val); 228 229 235 public abstract void setString(String val); 236 237 242 public abstract void setUndefined(); 243 244 249 public abstract void setValue(JsValue other); 250 251 257 270 public abstract void setWrappedJavaObject(CompilingClassLoader cl, Object val); 271 272 275 public String toString() { 276 if (isUndefined()) { 277 return "void"; 278 } else if (isNull()) { 279 return "null"; 280 } else if (isBoolean()) { 281 return "bool: " + (getBoolean() ? "true" : "false"); 282 } else if (isInt()) { 283 return "int: " + Integer.toString(getInt()); 284 } else if (isNumber()) { 285 return "double: " + Double.toString(getNumber()); 286 } else if (isWrappedJavaObject()) { 287 return "Java object: " + getWrappedJavaObject().toString(); 288 } else if (isJavaScriptObject()) { 289 return "JS object [" + getTypeString() + "] : " + getString(); 290 } else if (isString()) { 291 return "string: '" + getString() + "'"; 292 } else { 293 return "*unknown type: " + getTypeString() + "*"; 294 } 295 } 296 297 302 protected abstract JsCleanup createCleanupObject(); 303 304 309 protected final void finalize() throws Throwable { 310 queueCleanup(createCleanupObject()); 311 } 312 } 313 | Popular Tags |