All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.gdface.sdk.ContextLoader Maven / Gradle / Ivy

There is a newer version: 4.2.1
Show newest version
package net.gdface.sdk;

import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.ServiceLoader;

import net.gdface.utils.Judge;
import static net.gdface.utils.SimpleLog.log;
import static net.gdface.sdk.CapacityFieldConstant.C_SDK_VERSION;

/**
 * FaceApi应用上下文SPI加载工具类
 * @author guyadong
 *
 */
public class ContextLoader {
	private static final Map globalContext = new HashMap<>();
	private final LinkedHashMap classMap = new LinkedHashMap<>();
	private final LinkedHashMap versionMap= new LinkedHashMap<>();
	/** 所有找到的 FaceApi 上下文实例 */
	public final List CONTEXTS ;
	// 延迟加载的单实例
	private static class Singleton{
		static final ContextLoader INSTANCE = new ContextLoader();
	}
	/**
	 * 全局上下文字段定义
	 */
	public static enum GlobalContextField{
		/** 并发限制 [int]*/CONCURRENCY,
		/** 人脸检测倾向, [boolean] true:多人脸检测,false:用于帧相关单人脸检测 */MULIT_FACE_DETECT_TREND
	}
	/**
	 * 上下文字段定义
	 */
	public static enum ContextField{
		/** {@link FaceApi}实例 */INSTANCE,
		/** 授权管理器(LicenceManager)实例 */LICENCE_MANAGER;
		@SuppressWarnings("unchecked")
		public T from(FaceApiContext context){
			return (T) context.getContext().get(this);
		}
	}
	public  static final ContextLoader getInstance(){
		return Singleton.INSTANCE;
	}
	private ContextLoader() {
		// SPI 加载所有 FaceApi 上下文实例
		ServiceLoader providers = ServiceLoader.load(FaceApiContext.class);
		LinkedList list = new LinkedList<>();
		for(Iterator itor = providers.iterator();itor.hasNext();){
			FaceApiContext context = itor.next();
			list.add(context);
			FaceApi instance = ContextLoader.ContextField.INSTANCE.from(context);
			if(instance == null){
				// 跳过接口实例为空的并报错
				log("ERROR:FaceApi instance of {} is null",context.getClass().getName());
				continue;
			}
			classMap.put(instance.getClass().getName(), context);
			String sdkVersion = instance.sdkCapacity().get(C_SDK_VERSION);
			if(!Judge.isEmpty(sdkVersion)){
				versionMap.put(sdkVersion, context);
			}
		}
		CONTEXTS =  Collections.unmodifiableList(list);
	}
	/**
	 * 返回找到的第一个FaceApi应用上下文实例
	 * @return FaceApi应用上下文实例,找不到返回{@code null}
	 */
	public FaceApiContext getContext(){
		try {
			return CONTEXTS.get(0);
		} catch (IndexOutOfBoundsException e) {
			return null;
		}
	}
	/**
	 * 返回找到的第一个FaceApi应用上下文实例
	 * @return FaceApi应用上下文实例
	 * @throws IllegalStateException 找不到FaceApi应用上下文实例
	 */
	public FaceApiContext getContextChecked(){
		try {
			return CONTEXTS.get(0);
		} catch (IndexOutOfBoundsException e) {
			throw new IllegalStateException("NOT FOUND any " + FaceApiContext.class.getSimpleName() + " instance");
		}
	}
	/**
	 * 返回包含指定FaceApi实例类名的应用上下文
	 * @param className FaceApi实例类名(全名)
	 * @return FaceApi应用上下文实例,找不到返回{@code null}
	 */
	public FaceApiContext getContextByInstnaceClass(String className){
		return classMap.get(className);
	}
	/**
	 * 返回包含指定FaceApi实例类名的应用上下文
	 * @param className FaceApi实例类名(全名)
	 * @return FaceApi应用上下文实例
	 * @throws IllegalArgumentException 找不到指定的上下文实例
	 */
	public FaceApiContext getContextByInstnaceClassChecked(String className){
		FaceApiContext context = classMap.get(className);
		if(context == null){
			throw new IllegalArgumentException("INVALID instance class name: " + className);
		}
		return context;
	}
	/**
	 * 返回支持指定SDK版本号的应用上下文
	 * @param className SDK版本号
	 * @return FaceApi应用上下文实例,找不到返回{@code null}
	 */
	public FaceApiContext getContextBySdkVersion(String sdkVersion){
		return versionMap.get(sdkVersion);
	}
	/**
	 * 返回支持指定SDK版本号的应用上下文
	 * @param className SDK版本号
	 * @return FaceApi应用上下文实例,找不到返回{@code null}
	 * @throws IllegalArgumentException 找不到指定的上下文实例
	 */
	public FaceApiContext getContextBySdkVersionChecked(String sdkVersion){
		FaceApiContext context = versionMap.get(sdkVersion);
		if(context == null){
			throw new IllegalArgumentException("INVALID sdkVersion: " + sdkVersion);
		}
		return context;
	}
	/**
	 * 设置全局上下文,用于应用层在SDK初始化前指定初始化参数
* @param field * @param value */ public static void setGlobalContext(GlobalContextField field,Object value){ if(field != null && value != null){ globalContext.put(field, value); } } @SuppressWarnings("unchecked") public static T getGlobalcontext(GlobalContextField field) { if(field != null ){ return (T) globalContext.get(field); } return null; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy