Android Open Source - kirin-for-android Abstract Object Holder






From Project

Back to project page kirin-for-android.

License

The source code is released under:

Apache License

If you think the Android project kirin-for-android 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

package com.futureplatforms.kirin.internal.core;
/*from ww w .j ava 2  s .c  o m*/
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import org.json.JSONObject;

import android.text.TextUtils;
import android.util.Log;

import com.futureplatforms.kirin.C;
import com.futureplatforms.kirin.internal.attic.ProxyGenerator;

public abstract class AbstractObjectHolder implements IObjectHolder {

  private static final class JavaMethodCall implements Runnable {
    private final Method mMethod;
    private final Object[] mArgs;
    private final Object mNativeObject;
    private final ProxyGenerator mProxyGenerator;

    private JavaMethodCall(Object object, Method method, Object[] args, ProxyGenerator generator) {
      mMethod = method;
      mArgs = args;
      mNativeObject = object;
      mProxyGenerator = generator;
    }

    @Override
    public void run() {
      try {
        Class<?>[] argTypes = null;
        for (int i=0, max=mArgs.length; i<max; i++) {
          if (mArgs[i] instanceof JSONObject) {
            if (argTypes == null) {
              // do this only once.
              argTypes = mMethod.getParameterTypes();
            }
            if (argTypes[i].isInterface()) {
              mArgs[i] = mProxyGenerator.javascriptProxyForRequest((JSONObject) mArgs[i], argTypes[i]);
            }
          }
        }
        mMethod.invoke(mNativeObject, mArgs);
      } catch (InvocationTargetException ex) {
        Throwable e = ex.getTargetException();
        reportException(e);
      } catch (Exception e) {
        reportException(e);
      }
    }

    private void reportException(Throwable e) {
      String[] classes = new String[mArgs.length];
      for (int i = 0; i < mArgs.length; i++) {
        classes[i] = mArgs[i].getClass().getName();
      }

      Log.e(C.TAG, "Problem calling " + mNativeObject.getClass().getSimpleName() + "."
              + mMethod.getName() + "(" + TextUtils.join(", ", mMethod.getParameterTypes()) + ");");
      
      Log.d(C.TAG, "\tJSON arg types  : " + Arrays.toString(classes));
      Log.d(C.TAG, "\tActual values   : " + Arrays.toString(mArgs));
      Log.e(C.TAG, "Stacktrace:", e);
    }
  }

  private boolean mIsInitialized;
  
  private Map<String, Method> mMethodMap;
  
  protected final Object mNativeObject;
  
  private final ProxyGenerator mProxyGenerator; 
  
  public AbstractObjectHolder(Object nativeObject, ProxyGenerator proxyGenerator) {
    mNativeObject = nativeObject;
    mProxyGenerator = proxyGenerator;
  }
  
  @Override
  public Collection<String> getMethodNames() {
    ensureInitialized();
    return mMethodMap.keySet();
  }

  private void ensureInitialized() {
    // TODO does this need locks around it?
    if (!mIsInitialized) {
      calculateMethods();
      mIsInitialized = true;
    }
  }
  
  private void calculateMethods() {
    mMethodMap = new HashMap<String, Method>();
    Class<?> clazz = mNativeObject.getClass();
        for (Method method : clazz.getMethods()) {
            String className = method.getDeclaringClass().getName();
            if (!className.startsWith("android.") && !className.startsWith("java")) {
                String name = method.getName();
                if (mMethodMap.containsKey(name)) {
                  Log.w(C.TAG, "More than one " + name + " name declared on " + clazz + ". Behaviour is undefined.");
                }
        mMethodMap.put(name, method);
            }
        }
  }

  protected abstract void enqueue(Runnable methodCall);

  @Override
  public void invoke(final String methodName, final Object... args) {
    ensureInitialized();
    
    final Method method = mMethodMap.get(methodName);
        if (method == null) {
            Log.e(C.TAG, MessageFormat.format("Can''t invoke {0} on {1}", methodName, mNativeObject));
            return;
        }
      
    enqueue(new JavaMethodCall(mNativeObject, method, args, mProxyGenerator));
  }



}




Java Source Code List

com.futureplatforms.kirin.C.java
com.futureplatforms.kirin.Kirin.java
com.futureplatforms.kirin.TestingApplication.java
com.futureplatforms.kirin.activities.KirinActivity.java
com.futureplatforms.kirin.activities.KirinListActivity.java
com.futureplatforms.kirin.application.IKirinApplication.java
com.futureplatforms.kirin.application.KirinApplication.java
com.futureplatforms.kirin.extensions.IKirinExtensionOnNonDefaultThread.java
com.futureplatforms.kirin.extensions.IKirinExtensionOnUiThread.java
com.futureplatforms.kirin.extensions.IKirinExtension.java
com.futureplatforms.kirin.extensions.IProguardImmunity.java
com.futureplatforms.kirin.extensions.KirinExtensionAdapter.java
com.futureplatforms.kirin.extensions.KirinExtensions.java
com.futureplatforms.kirin.extensions.databases.DBStatement.java
com.futureplatforms.kirin.extensions.databases.DBTransaction.java
com.futureplatforms.kirin.extensions.databases.DatabasesBackend.java
com.futureplatforms.kirin.extensions.databases.IDatabasesBackend.java
com.futureplatforms.kirin.extensions.fs.KirinFilesystemExtensionImpl.java
com.futureplatforms.kirin.extensions.localnotifications.ILocalNotificationsBackend.java
com.futureplatforms.kirin.extensions.localnotifications.LocalNotificationAlarmReceiver.java
com.futureplatforms.kirin.extensions.localnotifications.LocalNotificationsBackend.java
com.futureplatforms.kirin.extensions.networking.INetworkingBackend.java
com.futureplatforms.kirin.extensions.networking.KirinXHRExtensionImpl.java
com.futureplatforms.kirin.extensions.networking.NetworkingBackend.java
com.futureplatforms.kirin.extensions.settings.ISettingsBackend.java
com.futureplatforms.kirin.extensions.settings.PreferencesBackendImpl.java
com.futureplatforms.kirin.extensions.settings.SettingsBackend.java
com.futureplatforms.kirin.generated.fs.KirinCallback.java
com.futureplatforms.kirin.generated.fs.KirinFile.java
com.futureplatforms.kirin.generated.fs.KirinFilesystemExtension.java
com.futureplatforms.kirin.generated.fs.KirinFilesystem.java
com.futureplatforms.kirin.generated.fs.KirinFoundFile.java
com.futureplatforms.kirin.generated.fs.KirinOptionalCallback.java
com.futureplatforms.kirin.generated.location.KirinLocationBackend.java
com.futureplatforms.kirin.generated.location.KirinLocationData.java
com.futureplatforms.kirin.generated.location.KirinLocationListener.java
com.futureplatforms.kirin.generated.location.KirinLocationPermissions.java
com.futureplatforms.kirin.generated.location.KirinLocation.java
com.futureplatforms.kirin.generated.preferences.KirinPreferenceListener.java
com.futureplatforms.kirin.generated.preferences.KirinPreferencesBackend.java
com.futureplatforms.kirin.generated.preferences.KirinPreferences.java
com.futureplatforms.kirin.generated.xhr.KirinXHRExtension.java
com.futureplatforms.kirin.generated.xhr.KirinXHRProgressEvent.java
com.futureplatforms.kirin.generated.xhr.KirinXHRResponse.java
com.futureplatforms.kirin.generated.xhr.KirinXHRequest.java
com.futureplatforms.kirin.generated.xhr.KirinXMLHTTPRequest.java
com.futureplatforms.kirin.helpers.IKirinExtensionHelper.java
com.futureplatforms.kirin.helpers.IKirinHelper.java
com.futureplatforms.kirin.helpers.KirinApplicationHelper.java
com.futureplatforms.kirin.helpers.KirinExtensionHelper.java
com.futureplatforms.kirin.helpers.KirinHelper.java
com.futureplatforms.kirin.helpers.KirinScreenHelper.java
com.futureplatforms.kirin.helpers.KirinUiFragmentHelper.java
com.futureplatforms.kirin.internal.JSONUtils.java
com.futureplatforms.kirin.internal.KirinPaths.java
com.futureplatforms.kirin.internal.attic.IOUtils.java
com.futureplatforms.kirin.internal.attic.KirinDropbox.java
com.futureplatforms.kirin.internal.attic.ProxyGenerator.java
com.futureplatforms.kirin.internal.attic.SDCardFileUtils.java
com.futureplatforms.kirin.internal.core.AbstractObjectHolder.java
com.futureplatforms.kirin.internal.core.DefaultObjectHandler.java
com.futureplatforms.kirin.internal.core.IJsContext.java
com.futureplatforms.kirin.internal.core.IKirinState.java
com.futureplatforms.kirin.internal.core.INativeContext.java
com.futureplatforms.kirin.internal.core.IObjectHolder.java
com.futureplatforms.kirin.internal.core.JsCommands.java
com.futureplatforms.kirin.internal.core.KirinAppState.java
com.futureplatforms.kirin.internal.core.KirinWebViewHolder.java
com.futureplatforms.kirin.internal.core.NativeContext.java
com.futureplatforms.kirin.internal.core.UiObjectHolder.java
com.futureplatforms.kirin.internal.fragmentation.CursorCoercer4.java
com.futureplatforms.kirin.internal.fragmentation.CursorCoercer5.java
com.futureplatforms.kirin.internal.fragmentation.CursorCoercer.java
com.futureplatforms.kirin.internal.fragmentation.WebChromeClient7.java
com.futureplatforms.kirin.internal.fragmentation.WebChromeClient8.java
com.futureplatforms.kirin.state.IKirinDropbox.java
com.futureplatforms.kirin.state.IKirinFileSystem.java
com.futureplatforms.kirin.ui.DebugMenuActions.java
com.futureplatforms.kirin.ui.JSListAdapter.java
com.futureplatforms.kirin.ui.JSOnClickListener.java
com.futureplatforms.kirin.ui.KirinRowRenderer.java