Android Open Source - anode J S Array






From Project

Back to project page anode.

License

The source code is released under:

Apache License

If you think the Android project anode listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright 2011-2012 Paddy Byers//from  ww  w .ja v  a 2s  .c  o  m
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 */

package org.meshpoint.anode.js;

import org.meshpoint.anode.bridge.BridgeNative;
import org.meshpoint.anode.bridge.Env;
import org.meshpoint.anode.bridge.SynchronousOperation;
import org.w3c.dom.Array;

public class JSArray implements Array {

  /*********************
   * private state
   *********************/

  private static final String TAG = JSArray.class.getCanonicalName();
  long instHandle; /* (long)Persistent<Object>* */
  Env env;

  /*********************
   * private API
   *********************/

  JSArray(long instHandle) {
    this.instHandle = instHandle;
    env = Env.getCurrent();
  }

  protected void dispose(int type) {
    //Log.v(TAG, "Putting for finalization; this class = " + this.getClass().getName() + "; instHandle = " + instHandle + "; type = " + type);
    env.finalizeQueue.put(instHandle, type);
  }

  /*********************
   * public API
   *********************/

  public int getLength() {
    if(env.isEventThread())
      return BridgeNative.getLength(env.getHandle(), instHandle);
    SyncOp op = deferOp(OP.GET_LENGTH, env, instHandle, 0, 0, null);
    return (op == null) ? 0 : op.idxOrLength;
  }

  public void setLength(int length) {
    if(env.isEventThread())
      BridgeNative.setLength(env.getHandle(), instHandle, length);
    deferOp(OP.SET_LENGTH, env, instHandle, 0, length, null);
  }

  protected SyncOp deferOp(OP op, Env env, long instHandle, int elementType, int idxOrLength, Object val) {
    SyncOp syncOp = threadSyncOp.get();
    if(syncOp == null) {
      syncOp = new SyncOp();
      threadSyncOp.set(syncOp);
    }
    return syncOp.scheduleWait(op, env, instHandle, elementType, idxOrLength, val);
  }

  /*********************
   * SynchronousOperation
   *********************/
  
  protected enum OP {GET_LENGTH, SET_LENGTH, GET_ELEMENT, SET_ELEMENT};

  protected static ThreadLocal<SyncOp> threadSyncOp = new ThreadLocal<SyncOp>();

  protected static class SyncOp implements SynchronousOperation {

    private OP op;
    private Env env;
    private long instHandle;
    Object ob;
    private int idxOrLength;
    private int elementType;
    private boolean isPending;
    private boolean isCancelled;

    @Override
    public void run() {
      switch(op) {
      case GET_LENGTH:
        idxOrLength = BridgeNative.getLength(env.getHandle(), instHandle);
        break;
      case SET_LENGTH:
        BridgeNative.setLength(env.getHandle(), instHandle, idxOrLength);
        break;
      case GET_ELEMENT:
        ob = BridgeNative.getIndexedProperty(env.getHandle(), instHandle, elementType, idxOrLength);
        break;
      case SET_ELEMENT:
        BridgeNative.setIndexedProperty(env.getHandle(), instHandle, elementType, idxOrLength, ob);
        break;
      }
      isPending = false;
    }

    @Override
    public boolean isPending() {return isPending;}
    
    private SyncOp scheduleWait(OP op, Env env, long instHandle, int elementType, int idxOrLength, Object val) {
      this.op = op;
      this.env = env;
      this.instHandle = instHandle;
      this.elementType = elementType;
      this.idxOrLength = idxOrLength;
      this.ob = val;
      this.isPending = true;
      this.isCancelled = false;
      /* FIXME: consider not waiting if void */
      env.waitForOperation(this);
      return isCancelled ? null : this;
    }

    @Override
    public void cancel() {
      isCancelled = true;
      isPending = false;
    }
  }
}




Java Source Code List

org.meshpoint.anode.AndroidContext.java
org.meshpoint.anode.AnodeActivity.java
org.meshpoint.anode.AnodeReceiver.java
org.meshpoint.anode.AnodeService.java
org.meshpoint.anode.Constants.java
org.meshpoint.anode.Isolate.java
org.meshpoint.anode.RuntimeNative.java
org.meshpoint.anode.Runtime.java
org.meshpoint.anode.bridge.BridgeNative.java
org.meshpoint.anode.bridge.Env.java
org.meshpoint.anode.bridge.Env.java
org.meshpoint.anode.bridge.FinalizeQueue.java
org.meshpoint.anode.bridge.ModuleClassLoader.java
org.meshpoint.anode.bridge.ModuleContext.java
org.meshpoint.anode.bridge.SynchronousOperation.java
org.meshpoint.anode.error.GeneralError.java
org.meshpoint.anode.error.InternalError.java
org.meshpoint.anode.error.ReferenceError.java
org.meshpoint.anode.error.ScriptError.java
org.meshpoint.anode.error.TypeError.java
org.meshpoint.anode.idl.BoundInterface.java
org.meshpoint.anode.idl.Callback.java
org.meshpoint.anode.idl.Dictionary.java
org.meshpoint.anode.idl.Dictionary.java
org.meshpoint.anode.idl.IDLInterface.java
org.meshpoint.anode.idl.IDLInterface.java
org.meshpoint.anode.idl.InterfaceManager.java
org.meshpoint.anode.idl.InterfaceManager.java
org.meshpoint.anode.idl.StubUtil.java
org.meshpoint.anode.idl.Types.java
org.meshpoint.anode.java.Array.java
org.meshpoint.anode.java.Base.java
org.meshpoint.anode.java.Base.java
org.meshpoint.anode.java.ByteArray.java
org.meshpoint.anode.java.DoubleArray.java
org.meshpoint.anode.java.IntegerArray.java
org.meshpoint.anode.java.LongArray.java
org.meshpoint.anode.java.ObjectArray.java
org.meshpoint.anode.js.JSArray.java
org.meshpoint.anode.js.JSByteArray.java
org.meshpoint.anode.js.JSDoubleArray.java
org.meshpoint.anode.js.JSFunction.java
org.meshpoint.anode.js.JSIntegerArray.java
org.meshpoint.anode.js.JSInterface.java
org.meshpoint.anode.js.JSLongArray.java
org.meshpoint.anode.js.JSObjectArray.java
org.meshpoint.anode.js.JSObject.java
org.meshpoint.anode.js.JSValue.java
org.meshpoint.anode.module.IModuleContext.java
org.meshpoint.anode.module.IModuleContext.java
org.meshpoint.anode.module.IModule.java
org.meshpoint.anode.module.IModule.java
org.meshpoint.anode.stub.DictionaryStubGenerator.java
org.meshpoint.anode.stub.PlatformStubGenerator.java
org.meshpoint.anode.stub.StubGenerator.java
org.meshpoint.anode.stub.UserStubGenerator.java
org.meshpoint.anode.stub.util.DirectoryClassLoader.java
org.meshpoint.anode.stub.util.StubGen.java
org.meshpoint.anode.type.ICollection.java
org.meshpoint.anode.type.IFunction.java
org.meshpoint.anode.type.IIndexedCollection.java
org.meshpoint.anode.util.AndroidLog.java
org.meshpoint.anode.util.ArgProcessor.java
org.meshpoint.anode.util.Log.java
org.meshpoint.anode.util.ModuleUtils.java
org.meshpoint.anode.util.PrintStreamLog.java
org.meshpoint.anode.util.TarExtractor.java
org.meshpoint.anode.util.ZipExtractor.java
org.w3c.dom.Array.java
org.w3c.dom.Array.java
org.w3c.dom.ByteArray.java
org.w3c.dom.ByteArray.java
org.w3c.dom.DoubleArray.java
org.w3c.dom.DoubleArray.java
org.w3c.dom.IntegerArray.java
org.w3c.dom.IntegerArray.java
org.w3c.dom.LongArray.java
org.w3c.dom.LongArray.java
org.w3c.dom.ObjectArray.java
org.w3c.dom.ObjectArray.java
org.w3c.dom.PrimitiveArray.java
org.w3c.dom.PrimitiveArray.java