1 29 30 package com.caucho.quercus.env; 31 32 import com.caucho.quercus.expr.Expr; 33 import com.caucho.quercus.program.AbstractFunction; 34 import com.caucho.quercus.program.JavaClassDef; 35 import com.caucho.vfs.ContextLoaderObjectInputStream; 36 import com.caucho.vfs.WriteStream; 37 38 import java.io.IOException ; 39 import java.io.InputStream ; 40 import java.io.ObjectInputStream ; 41 import java.io.ObjectOutputStream ; 42 import java.io.Serializable ; 43 import java.util.IdentityHashMap ; 44 import java.util.Map ; 45 import java.util.logging.Logger ; 46 47 50 public class JavaValue extends ResourceValue 51 implements Serializable 52 { 53 private static final Logger log 54 = Logger.getLogger(JavaValue.class.getName()); 55 56 private JavaClassDef _classDef; 57 58 private Object _object; 59 60 protected Env _env; 61 62 public JavaValue(Env env, Object object, JavaClassDef def) 63 { 64 if (object == null) 65 throw new NullPointerException (); 66 67 _env = env; 68 _classDef = def; 69 _object = object; 70 } 71 72 public String getClassName() 73 { 74 return _classDef.getName(); 75 } 76 77 @Override 78 protected void printRImpl(Env env, 79 WriteStream out, 80 int depth, 81 IdentityHashMap <Value, String > valueSet) 82 throws IOException 83 { 84 super.printRImpl(env, out, depth, valueSet); 86 } 87 88 @Override 89 protected void varDumpImpl(Env env, 90 WriteStream out, 91 int depth, 92 IdentityHashMap <Value, String > valueSet) 93 throws IOException 94 { 95 if (!_classDef.varDumpImpl(env, _object, out, depth, valueSet)) 96 super.varDumpImpl(env, out, depth, valueSet); 97 } 98 99 @Override 100 public Value get(Value name) 101 { 102 return _classDef.get(_env, _object, name); 103 } 104 105 @Override 106 public Value put(Value index, Value value) 107 { 108 return _classDef.put(_env, _object, index, value); 109 } 110 111 @Override 112 public Value getField(Env env, String name) 113 { 114 return _classDef.getField(env, _object, name); 115 } 116 117 @Override 118 public Value putField(Env env, 119 String name, 120 Value value) 121 { 122 return _classDef.putField(env, _object, name, value); 123 } 124 125 128 public String getName() 129 { 130 return _classDef.getName(); 131 } 132 133 136 public String getType() 137 { 138 return "object"; 139 } 140 141 144 public boolean toBoolean() 145 { 146 return true; 147 } 148 149 152 public long toLong() 153 { 154 return 1; 155 } 156 157 160 public double toDouble() 161 { 162 return toLong(); 163 } 164 165 168 public Value toKey() 169 { 170 return new LongValue(System.identityHashCode(this)); 171 } 172 173 public boolean isA(String name) 174 { 175 return _classDef.isA(name); 176 } 177 178 181 public AbstractFunction findFunction(String methodName) 182 { 183 return _classDef.findFunction(methodName); 184 } 185 186 189 public Value callMethod(Env env, String methodName, Expr []args) 190 { 191 return _classDef.callMethod(env, _object, methodName, args); 192 } 193 194 197 public Value callMethod(Env env, String methodName, Value []args) 198 { 199 return _classDef.callMethod(env, _object, methodName, args); 200 } 201 202 205 public Value callMethod(Env env, String methodName) 206 { 207 return _classDef.callMethod(env, _object, methodName); 208 } 209 210 213 public Value callMethod(Env env, String methodName, Value a1) 214 { 215 return _classDef.callMethod(env, _object, methodName, a1); 216 } 217 218 221 public Value callMethod(Env env, String methodName, Value a1, Value a2) 222 { 223 return _classDef.callMethod(env, _object, methodName, a1, a2); 224 } 225 226 229 public Value callMethod(Env env, String methodName, 230 Value a1, Value a2, Value a3) 231 { 232 return _classDef.callMethod(env, _object, methodName, a1, a2, a3); 233 } 234 235 238 public Value callMethod(Env env, String methodName, 239 Value a1, Value a2, Value a3, Value a4) 240 { 241 return _classDef.callMethod(env, _object, methodName, a1, a2, a3, a4); 242 } 243 244 247 public Value callMethod(Env env, String methodName, 248 Value a1, Value a2, Value a3, Value a4, Value a5) 249 { 250 return _classDef.callMethod(env, _object, methodName, a1, a2, a3, a4, a5); 251 } 252 253 256 public Value callMethodRef(Env env, String methodName, Expr []args) 257 { 258 return _classDef.callMethod(env, _object, methodName, args); 259 } 260 261 264 public Value callMethodRef(Env env, String methodName, Value []args) 265 { 266 return _classDef.callMethod(env, _object, methodName, args); 267 } 268 269 272 public Value callMethodRef(Env env, String methodName) 273 { 274 return _classDef.callMethod(env, _object, methodName); 275 } 276 277 280 public Value callMethodRef(Env env, String methodName, Value a1) 281 { 282 return _classDef.callMethod(env, _object, methodName, a1); 283 } 284 285 288 public Value callMethodRef(Env env, String methodName, Value a1, Value a2) 289 { 290 return _classDef.callMethod(env, _object, methodName, a1, a2); 291 } 292 293 296 public Value callMethodRef(Env env, String methodName, 297 Value a1, Value a2, Value a3) 298 { 299 return _classDef.callMethod(env, _object, methodName, a1, a2, a3); 300 } 301 302 305 public Value callMethodRef(Env env, String methodName, 306 Value a1, Value a2, Value a3, Value a4) 307 { 308 return _classDef.callMethod(env, _object, methodName, a1, a2, a3, a4); 309 } 310 311 314 public Value callMethodRef(Env env, String methodName, 315 Value a1, Value a2, Value a3, Value a4, Value a5) 316 { 317 return _classDef.callMethod(env, _object, methodName, a1, a2, a3, a4, a5); 318 } 319 320 323 public Value []getValueArray(Env env) 324 { 325 return _classDef.getValueArray(env, _object); 326 } 327 328 331 public void serialize(StringBuilder sb) 332 { 333 log.fine("Quercus: can't serialize " + _object.getClass()); 334 335 sb.append("N;"); 336 } 337 338 341 public String toString() 342 { 343 return String.valueOf(_object); 345 } 346 347 348 351 @Override 352 public Object toJavaObject() 353 { 354 return _object; 355 } 356 357 360 @Override 361 public Object toJavaObject(Env env, Class type) 362 { 363 if (type.isAssignableFrom(_object.getClass())) { 364 return _object; 365 } else { 366 env.warning(L.l("Can't assign {0} to {1}", 367 _object.getClass().getName(), type.getName())); 368 369 return null; 370 } 371 } 372 373 376 @Override 377 public Object toJavaObjectNotNull(Env env, Class type) 378 { 379 if (type.isAssignableFrom(_object.getClass())) { 380 return _object; 381 } else { 382 env.warning(L.l("Can't assign {0} to {1}", 383 _object.getClass().getName(), type.getName())); 384 385 return null; 386 } 387 } 388 389 392 @Override 393 public Map toJavaMap(Env env, Class type) 394 { 395 if (type.isAssignableFrom(_object.getClass())) { 396 return (Map ) _object; 397 } else { 398 env.warning(L.l("Can't assign {0} to {1}", 399 _object.getClass().getName(), type.getName())); 400 401 return null; 402 } 403 } 404 405 408 @Override 409 public InputStream toInputStream() 410 { 411 if (_object instanceof InputStream) 412 return (InputStream) _object; 413 else 414 return super.toInputStream(); 415 } 416 417 421 private void writeObject(ObjectOutputStream out) 422 throws IOException 423 { 424 out.writeObject(_classDef.getType().getCanonicalName()); 425 426 out.writeObject(_object); 427 } 428 429 private void readObject(ObjectInputStream in) 430 throws ClassNotFoundException , IOException 431 { 432 _env = Env.getInstance(); 433 434 _classDef = _env.getJavaClassDefinition((String ) in.readObject()); 435 436 _object = in.readObject(); 437 } 438 } 439 440 | Popular Tags |