bridge extension and plugin map

This commit is contained in:
pengfei.zhou 2019-07-19 13:46:57 +08:00
parent 15b5bebcf0
commit 920aab1035
6 changed files with 152 additions and 72 deletions

View File

@ -1,9 +1,12 @@
package com.github.pengfeizhou.doric;
import com.github.pengfeizhou.doric.bridge.DoricNativePlugin;
import com.github.pengfeizhou.doric.extension.DoricPluginInfo;
import com.github.pengfeizhou.doric.utils.DoricSettableFuture;
import com.github.pengfeizhou.jscore.JSDecoder;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.HashMap;
import java.util.Map;
/**
* @Description: Doric
@ -11,8 +14,8 @@ import java.util.concurrent.atomic.AtomicInteger;
* @CreateDate: 2019-07-18
*/
public class DoricContext {
private static AtomicInteger sCounter = new AtomicInteger();
private final String mContextId;
private final Map<String, DoricNativePlugin> mPluginMap = new HashMap<>();
DoricContext(String contextId) {
this.mContextId = contextId;
@ -33,5 +36,15 @@ public class DoricContext {
public void teardown() {
DoricDriver.getInstance().destroyContext(mContextId);
mPluginMap.clear();
}
public DoricNativePlugin obtainPlugin(DoricPluginInfo doricPluginInfo) {
DoricNativePlugin plugin = mPluginMap.get(doricPluginInfo.getName());
if (plugin == null) {
plugin = doricPluginInfo.createPlugin(this);
mPluginMap.put(doricPluginInfo.getName(), plugin);
}
return plugin;
}
}

View File

@ -57,13 +57,13 @@ public class DoricJSEngine implements Handler.Callback, DoricTimerExtension.Time
String message = args[1].string();
switch (type) {
case "w":
DoricLog.w(message, "_js");
DoricLog.w("_js", message);
break;
case "e":
DoricLog.e(message, "_js");
DoricLog.e("_js", message);
break;
default:
DoricLog.d(message, "_js");
DoricLog.d("_js", message);
break;
}
} catch (Exception e) {
@ -79,7 +79,7 @@ public class DoricJSEngine implements Handler.Callback, DoricTimerExtension.Time
String name = args[0].string();
String content = Doric.getJSBundle(name);
if (TextUtils.isEmpty(content)) {
DoricLog.e("error");
DoricLog.e("require js bundle:%s is empty", name);
return new JavaValue(false);
}
mDoricJSE.loadJS(packageModuleScript(name, content), "Module://" + name);

View File

@ -1,24 +1,59 @@
package com.github.pengfeizhou.doric.extension;
import android.text.TextUtils;
import com.github.pengfeizhou.doric.DoricContext;
import com.github.pengfeizhou.doric.DoricDriver;
import com.github.pengfeizhou.doric.bridge.DoricNativePlugin;
import com.github.pengfeizhou.doric.bridge.ModalPlugin;
import com.github.pengfeizhou.doric.utils.DoricLog;
import com.github.pengfeizhou.jscore.JSDecoder;
import com.github.pengfeizhou.jscore.JavaValue;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
/**
* @Description: Doric
* @Author: pengfei.zhou
* @CreateDate: 2019-07-18
*/
public class DoricBridgeExtension {
private Map<String, DoricPluginInfo> pluginInfoMap = new HashMap<>();
public DoricBridgeExtension() {
registerExtension(ModalPlugin.class);
}
public JavaValue callNative(String contextId, String module, String method, String callbackId, JSDecoder jsDecoder) {
DoricContext doricContext = DoricDriver.getInstance().getContext(contextId);
return null;
public void registerExtension(Class<? extends DoricNativePlugin> pluginClass) {
DoricPluginInfo doricPluginInfo = new DoricPluginInfo(pluginClass);
if (!TextUtils.isEmpty(doricPluginInfo.getName())) {
pluginInfoMap.put(doricPluginInfo.getName(), doricPluginInfo);
}
}
public JavaValue callNative(String contextId, String module, String methodName, String callbackId, JSDecoder jsDecoder) {
DoricContext context = DoricDriver.getInstance().getContext(contextId);
DoricPluginInfo pluginInfo = pluginInfoMap.get(module);
if (pluginInfo == null) {
DoricLog.e("Cannot find plugin class:%s", module);
return new JavaValue(false);
}
DoricNativePlugin doricNativePlugin = context.obtainPlugin(pluginInfo);
if (doricNativePlugin == null) {
DoricLog.e("Cannot obtain plugin instance:%s,method:%", module);
return new JavaValue(false);
}
Method method = pluginInfo.getMethod(methodName);
if (method == null) {
DoricLog.e("Cannot find plugin method in class:%s,method:%s", module, methodName);
return new JavaValue(false);
}
Class[] classes = method.getParameterTypes();
return new JavaValue(true);
}
}

View File

@ -0,0 +1,64 @@
package com.github.pengfeizhou.doric.extension;
import android.text.TextUtils;
import com.github.pengfeizhou.doric.DoricContext;
import com.github.pengfeizhou.doric.bridge.DoricNativePlugin;
import com.github.pengfeizhou.doric.utils.DoricLog;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @Description: Doric
* @Author: pengfei.zhou
* @CreateDate: 2019-07-18
*/
public class DoricPluginInfo {
private Constructor<? extends DoricNativePlugin> pluginConstructor;
private Map<String, Method> methodMap = new ConcurrentHashMap<>();
public boolean stringify = false;
private String name;
public DoricPluginInfo(Class<? extends DoricNativePlugin> pluginClass) {
try {
this.pluginConstructor = pluginClass.getConstructor(DoricContext.class);
DoricComponent doricComponent = pluginClass.getAnnotation(DoricComponent.class);
this.name = doricComponent.name();
Method[] methods = pluginClass.getMethods();
for (Method method : methods) {
DoricMethod doricMethod = method.getAnnotation(DoricMethod.class);
if (doricMethod != null) {
if (TextUtils.isEmpty(doricMethod.name())) {
methodMap.put(method.getName(), method);
} else {
methodMap.put(doricMethod.name(), method);
}
}
}
} catch (Exception e) {
DoricLog.e("Error to create doric for " + e.getLocalizedMessage());
}
}
public String getName() {
return name;
}
public DoricNativePlugin createPlugin(DoricContext doricContext) {
try {
return pluginConstructor.newInstance(doricContext);
} catch (Exception e) {
DoricLog.e("Error to create doric plugin for " + e.getLocalizedMessage());
return null;
}
}
public Method getMethod(String name) {
return methodMap.get(name);
}
}

View File

@ -1,44 +0,0 @@
package com.github.pengfeizhou.doric.extension;
import android.text.TextUtils;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
/**
* @Description: Doric
* @Author: pengfei.zhou
* @CreateDate: 2019-07-18
*/
public class ModuleClassInfo {
private Class clz;
private Object instance;
private Map<String, Method> methodMap = new HashMap<>();
public boolean stringify = false;
public ModuleClassInfo(Class clz) {
this.clz = clz;
try {
this.instance = clz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
Method[] methods = clz.getMethods();
if (methods != null) {
for (Method method : methods) {
DoricMethod doricMethod = method.getAnnotation(DoricMethod.class);
if (doricMethod != null) {
if (TextUtils.isEmpty(doricMethod.name())) {
methodMap.put(method.getName(), method);
} else {
methodMap.put(doricMethod.name(), method);
}
}
}
}
}
}

View File

@ -1,5 +1,6 @@
package com.github.pengfeizhou.doric.utils;
import android.text.TextUtils;
import android.util.Log;
import com.github.pengfeizhou.doric.Doric;
@ -12,27 +13,38 @@ import com.github.pengfeizhou.doric.Doric;
public class DoricLog {
private static String TAG = Doric.class.getSimpleName();
public static void d(String message, String... suffix) {
StringBuilder stringBuilder = new StringBuilder(TAG);
for (String s : suffix) {
stringBuilder.append(s);
}
Log.d(stringBuilder.toString(), message);
public static void d(String message, Object... args) {
Log.d(suffixTag(null), format(message, args));
}
public static void w(String message, String... suffix) {
StringBuilder stringBuilder = new StringBuilder(TAG);
for (String s : suffix) {
stringBuilder.append(s);
}
Log.w(stringBuilder.toString(), message);
public static void w(String message, Object... args) {
Log.w(suffixTag(null), format(message, args));
}
public static void e(String message, String... suffix) {
StringBuilder stringBuilder = new StringBuilder(TAG);
for (String s : suffix) {
stringBuilder.append(s);
public static void e(String message, Object... args) {
Log.e(suffixTag(null), format(message, args));
}
Log.e(stringBuilder.toString(), message);
public static void d(String suffix, String message, Object... args) {
Log.d(suffixTag(suffix), format(message, args));
}
public static void w(String suffix, String message, Object... args) {
Log.w(suffixTag(suffix), format(message, args));
}
public static void e(String suffix, String message, Object... args) {
Log.e(suffixTag(suffix), format(message, args));
}
private static String suffixTag(String suffix) {
return TextUtils.isEmpty(suffix) ? TAG : suffix + TAG;
}
private static String format(String message, Object... args) {
return String.format(message, args);
}
}