org.chromium.sdk/src/org/chromium/sdk/internal/JsVariableImpl.java
changeset 2 e4420d2515f1
child 52 f577ea64429e
equal deleted inserted replaced
1:ef76fc2ac88c 2:e4420d2515f1
       
     1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
       
     2 // Use of this source code is governed by a BSD-style license that can be
       
     3 // found in the LICENSE file.
       
     4 
       
     5 package org.chromium.sdk.internal;
       
     6 
       
     7 
       
     8 import org.chromium.sdk.JsVariable;
       
     9 import org.chromium.sdk.JsValue.Type;
       
    10 
       
    11 /**
       
    12  * A generic implementation of the JsVariable interface.
       
    13  */
       
    14 public class JsVariableImpl implements JsVariable {
       
    15 
       
    16   /**
       
    17    * The variable value data as reported by the JavaScript VM (is used to
       
    18    * construct the variable value.)
       
    19    */
       
    20   private final ValueMirror valueData;
       
    21 
       
    22   /** The call frame this variable belongs in. */
       
    23   private final CallFrameImpl callFrame;
       
    24 
       
    25   /** The fully qualified name of this variable. */
       
    26   private final String variableFqn;
       
    27 
       
    28   private final NameDecorator nameDecorator;
       
    29 
       
    30   /** The lazily constructed value of this variable. */
       
    31   private final JsValueImpl value;
       
    32 
       
    33   /** Variable name. */
       
    34   private final String rawName;
       
    35 
       
    36   /**
       
    37    * Constructs a variable contained in the given call frame with the given
       
    38    * value mirror.
       
    39    *
       
    40    * @param callFrame that owns this variable
       
    41    * @param valueData value data for this variable
       
    42    */
       
    43   JsVariableImpl(CallFrameImpl callFrame, ValueMirror valueData, String name) {
       
    44     this(callFrame, valueData, name, null, NameDecorator.NOOP);
       
    45   }
       
    46 
       
    47   /**
       
    48    * Constructs a variable contained in the given call frame with the given
       
    49    * value mirror.
       
    50    *
       
    51    * @param callFrame that owns this variable
       
    52    * @param valueData for this variable
       
    53    * @param variableFqn the fully qualified name of this variable
       
    54    */
       
    55   JsVariableImpl(CallFrameImpl callFrame, ValueMirror valueData, String name, String variableFqn,
       
    56       NameDecorator nameDecorator) {
       
    57     this.callFrame = callFrame;
       
    58     this.valueData = valueData;
       
    59     this.rawName = name;
       
    60     this.variableFqn = variableFqn;
       
    61     this.nameDecorator = nameDecorator;
       
    62 
       
    63     Type type = this.valueData.getType();
       
    64     switch (type) {
       
    65       case TYPE_FUNCTION:
       
    66         this.value = new JsFunctionImpl(callFrame, this.variableFqn, this.valueData);
       
    67         break;
       
    68       case TYPE_ERROR:
       
    69       case TYPE_OBJECT:
       
    70         this.value = new JsObjectImpl(callFrame, this.variableFqn, this.valueData);
       
    71         break;
       
    72       case TYPE_ARRAY:
       
    73         this.value = new JsArrayImpl(callFrame, this.variableFqn, this.valueData);
       
    74         break;
       
    75       default:
       
    76         this.value = new JsValueImpl(this.valueData);
       
    77     }
       
    78   }
       
    79 
       
    80   /**
       
    81    * @return a [probably compound] JsValue corresponding to this variable.
       
    82    *         {@code null} if there was an error lazy-loading the value data.
       
    83    */
       
    84   public JsValueImpl getValue() {
       
    85     return value;
       
    86   }
       
    87 
       
    88   public String getName() {
       
    89     return nameDecorator.decorateVarName(rawName);
       
    90   }
       
    91 
       
    92   public String getRawName() {
       
    93     return this.rawName;
       
    94   }
       
    95 
       
    96   public boolean isMutable() {
       
    97     return false; // TODO(apavlov): fix once V8 supports it
       
    98   }
       
    99 
       
   100   public boolean isReadable() {
       
   101     // TODO(apavlov): implement once the readability metadata are available
       
   102     return true;
       
   103   }
       
   104 
       
   105   public synchronized void setValue(String newValue, SetValueCallback callback) {
       
   106     // TODO(apavlov): currently V8 does not support it
       
   107     if (!isMutable()) {
       
   108       throw new UnsupportedOperationException();
       
   109     }
       
   110   }
       
   111 
       
   112   @Override
       
   113   public String toString() {
       
   114     return new StringBuilder()
       
   115         .append("[JsVariable: name=")
       
   116         .append(getName())
       
   117         .append(",value=")
       
   118         .append(getValue())
       
   119         .append(']')
       
   120         .toString();
       
   121   }
       
   122 
       
   123   /**
       
   124    * Returns the call frame owning this variable.
       
   125    */
       
   126   protected CallFrameImpl getCallFrame() {
       
   127     return callFrame;
       
   128   }
       
   129 
       
   130   public ValueMirror getMirror() {
       
   131     return valueData;
       
   132   }
       
   133 
       
   134   public String getFullyQualifiedName() {
       
   135     return variableFqn != null
       
   136         ? variableFqn
       
   137         : getName();
       
   138   }
       
   139 
       
   140   static abstract class NameDecorator {
       
   141     static final NameDecorator NOOP = new NameDecorator() {
       
   142       @Override
       
   143       String decorateVarName(String rawName) {
       
   144         return rawName;
       
   145       }
       
   146       @Override
       
   147       String buildAccessSuffix(String rawName) {
       
   148         return "." + rawName;
       
   149       }
       
   150     };
       
   151     abstract String decorateVarName(String rawName);
       
   152     abstract String buildAccessSuffix(String rawName);
       
   153   }
       
   154 }