
net.gdface.sdk.fse.FeatureSeSpringController Maven / Gradle / Ivy
// ______________________________________________________
// Generated by codegen - https://gitee.com/l0km/codegen
// template: decorator/spring.controller.class.vm
// ______________________________________________________
/**
* decorator pattern 装饰者模式代理{@link FeatureSe}接口
* 将{@link FeatureSe}实例封装为一个spring controler
* 计算机生成代码(generated by automated tools DecoratorGenerator @author guyadong)
* @author guyadong
*
*/
package net.gdface.sdk.fse;
import java.util.ServiceLoader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Iterator;
import java.util.Objects;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
/**
* 特征码内存搜索引擎(feature search engine)接口
* 提供高速的人脸特征相似度比对搜索/排序,支持多线程并行搜索,适用于百万级以上人脸库的快速搜索。
* 1.使用 {@link #addFeature(byte[], byte[], String)}方法将特征添加到搜索引擎
* 2.使用 {@link #searchCode(byte[], double, int)}在内存中搜索与指定特征相似的的特征返回搜索结果
* @author guyadong
*/
@RestController
@Api(value="FeatureSe",tags={"FeatureSe Controller"})
public class FeatureSeSpringController {
private static final Logger logger = LoggerFactory.getLogger(FeatureSeSpringController.class);
private static InstanceSupplier instanceSupplier = getInstanceSupplier();
private final ResponseFactory responseFactory = loadResponseFactory();
/**
* SPI(Service Provider Interface)机制加载 {@link InstanceSupplier}实例,没有找到则返回{@code null},
* 返回{@link InstanceSupplier}提供的{@link FeatureSe}实例
* @return 返回{@link FeatureSe}实例
*/
private static final InstanceSupplier getInstanceSupplier() {
/* SPI(Service Provider Interface)机制加载 {@link InstanceSupplier}实例,没有找到则抛出异常 */
ServiceLoader providers = ServiceLoader.load(InstanceSupplier.class);
Iterator itor = providers.iterator();
return itor.hasNext() ? itor.next() : null;
}
/**
* @param instanceSupplier 要设置的 instanceSupplier
*/
public static void setInstanceSupplier(InstanceSupplier instanceSupplier) {
FeatureSeSpringController.instanceSupplier = instanceSupplier;
}
/**
* SPI(Service Provider Interface)加载{@link ResponseFactory}接口实例,
* 没有找到则返回{@link DefaultResponseFactory}实例
* @return 返回{@link ResponseFactory}实例
*/
private static final ResponseFactory loadResponseFactory() {
ServiceLoader providers = ServiceLoader.load(ResponseFactory.class);
Iterator itor = providers.iterator();
return itor.hasNext() ? itor.next() : new DefaultResponseFactory();
}
public FeatureSeSpringController() {
}
/**
* @return 返回被装饰的{@link FeatureSe}实例
*/
protected FeatureSe delegate() {
return Objects.requireNonNull(
instanceSupplier == null ? null : instanceSupplier.instanceOfFeatureSe(),
"FeatureSe instance is null" );
}
// port-1
/**
* 添加一条特征码到内存表
* @param featureId 特征码ID(MD5校验码),为null时,native library会自动计算MD5作为特征码ID
* @param feature 特征码字节数组,为{@code null}时返回false
* @param imgMD5 特征所属图的MD5(32字节HEX字符串),可为null
* @return 添加成功返回true, 否则返回false
*/
@ResponseBody
@RequestMapping(value = "/FeatureSe/addFeatureToFse", method = RequestMethod.POST)
@ApiOperation(value = "添加一条特征码到内存表
", notes = "添加一条特征码到内存表
",httpMethod="POST")
public Response addFeature( @RequestBody AddFeatureToFseArgs args)
{
Response response = responseFactory.newFeatureSeResponse();
try{
response.onComplete(delegate().addFeature(args.featureId,args.feature,args.imgMD5));
}
catch(Exception e){
logger.error(e.getMessage(),e);
response.onError(e);
}
return response;
}
// port-2
/**
* 添加一条特征码到内存表
* @param featureId 特征码ID(MD5校验码),为null时,native library会自动计算MD5作为特征码ID
* @param feature 特征码字节数组,为{@code null}时返回false
* @param appid 应用id,由调用者定义,可为null
* @return 添加成功返回true, 否则返回false
*/
@ResponseBody
@RequestMapping(value = "/FeatureSe/addFeatureToFseWithAppId", method = RequestMethod.POST)
@ApiOperation(value = "添加一条特征码到内存表
", notes = "添加一条特征码到内存表
",httpMethod="POST")
public Response addFeature( @RequestBody AddFeatureToFseWithAppIdArgs args)
{
Response response = responseFactory.newFeatureSeResponse();
try{
response.onComplete(delegate().addFeature(args.featureId,args.feature,args.appid));
}
catch(Exception e){
logger.error(e.getMessage(),e);
response.onError(e);
}
return response;
}
// port-3
/**
* 删除内存表中所有特征数据
*/
@ResponseBody
@RequestMapping(value = "/FeatureSe/clearAllOfFse", method = RequestMethod.POST)
@ApiOperation(value = "删除内存表中所有特征数据", notes = "删除内存表中所有特征数据",httpMethod="POST")
public Response clearAll()
{
Response response = responseFactory.newFeatureSeResponse();
try{
delegate().clearAll();
response.onComplete();
}
catch(Exception e){
logger.error(e.getMessage(),e);
response.onError(e);
}
return response;
}
// port-4
/**
* 根据特征码ID在表中查找指定的记录
* @param featureId 特征码ID,MD5校验码(16 bytes)
* @return 返回指定的特征记录,没有找到则返回{@code null},{@code featureId}为{@code null}或空返回{@code null}
*/
@ResponseBody
@RequestMapping(value = "/FeatureSe/getFeatureFromFse", method = RequestMethod.POST)
@ApiOperation(value = "根据特征码ID在表中查找指定的记录", notes = "根据特征码ID在表中查找指定的记录",httpMethod="POST")
public Response getFeature( @RequestBody GetFeatureFromFseArgs args)
{
Response response = responseFactory.newFeatureSeResponse();
try{
response.onComplete(delegate().getFeature(args.featureId));
}
catch(Exception e){
logger.error(e.getMessage(),e);
response.onError(e);
}
return response;
}
// port-5
/**
* 根据特征码ID在表中查找指定的记录
* @param featureId 特征码ID,MD5校验码(32字节HEX字符串)
* @return 返回指定的特征记录,没有找到则返回{@code null},{@code featureId}为{@code null}或空返回{@code null}
*/
@ResponseBody
@RequestMapping(value = "/FeatureSe/getFeatureByHexFromFse", method = RequestMethod.POST)
@ApiOperation(value = "根据特征码ID在表中查找指定的记录", notes = "根据特征码ID在表中查找指定的记录",httpMethod="POST")
public Response getFeatureByHex( @RequestBody GetFeatureByHexFromFseArgs args)
{
Response response = responseFactory.newFeatureSeResponse();
try{
response.onComplete(delegate().getFeatureByHex(args.featureId));
}
catch(Exception e){
logger.error(e.getMessage(),e);
response.onError(e);
}
return response;
}
// port-6
/**
* 根据特征码ID中表中删除指定的记录
* @param featureId 特征码ID,MD5校验码(16 bytes)
* @return 成功删除则返回true,否则返回false
*/
@ResponseBody
@RequestMapping(value = "/FeatureSe/removeFeatureFromFse", method = RequestMethod.POST)
@ApiOperation(value = "根据特征码ID中表中删除指定的记录", notes = "根据特征码ID中表中删除指定的记录",httpMethod="POST")
public Response removeFeature( @RequestBody RemoveFeatureFromFseArgs args)
{
Response response = responseFactory.newFeatureSeResponse();
try{
response.onComplete(delegate().removeFeature(args.featureId));
}
catch(Exception e){
logger.error(e.getMessage(),e);
response.onError(e);
}
return response;
}
// port-7
/**
* 根据特征码ID中表中删除指定的记录
* @param featureId 特征码ID,MD5校验码(32字节HEX字符串)
* @return 成功删除则返回true,否则返回false
*/
@ResponseBody
@RequestMapping(value = "/FeatureSe/removeFeatureByHexFromFse", method = RequestMethod.POST)
@ApiOperation(value = "根据特征码ID中表中删除指定的记录", notes = "根据特征码ID中表中删除指定的记录",httpMethod="POST")
public Response removeFeatureByHex( @RequestBody RemoveFeatureByHexFromFseArgs args)
{
Response response = responseFactory.newFeatureSeResponse();
try{
response.onComplete(delegate().removeFeatureByHex(args.featureId));
}
catch(Exception e){
logger.error(e.getMessage(),e);
response.onError(e);
}
return response;
}
// port-8
/**
* 在内存表中根据比对相似度进行特征码搜索
* @param code 要比对的特征码
* @param sim 相似度阀值
* @param rows 最大返回的记录数
* @return 返回包含相似度(降序)的结果数组,如果没有查到匹配的记录则返回空数组
*/
@ResponseBody
@RequestMapping(value = "/FeatureSe/searchCodeFromFse", method = RequestMethod.POST)
@ApiOperation(value = "在内存表中根据比对相似度进行特征码搜索", notes = "在内存表中根据比对相似度进行特征码搜索",httpMethod="POST")
public Response searchCode( @RequestBody SearchCodeFromFseArgs args)
{
Response response = responseFactory.newFeatureSeResponse();
try{
response.onComplete(delegate().searchCode(args.code,args.sim,args.rows));
}
catch(Exception e){
logger.error(e.getMessage(),e);
response.onError(e);
}
return response;
}
// port-9
/**
* @return 内存表中元素个数
*/
@ResponseBody
@RequestMapping(value = "/FeatureSe/sizeOfFse", method = RequestMethod.POST)
@ApiOperation(value = "", notes = "",httpMethod="POST")
public Response size()
{
Response response = responseFactory.newFeatureSeResponse();
try{
response.onComplete(delegate().size());
}
catch(Exception e){
logger.error(e.getMessage(),e);
response.onError(e);
}
return response;
}
/**
* argClass-1
* wrap arguments for method {@link #addFeature(AddFeatureToFseArgs)}
*/
public static class AddFeatureToFseArgs{
@ApiModelProperty(value ="特征码ID(MD5校验码),为null时,native library会自动计算MD5作为特征码ID" ,required=true ,dataType="byte[]")
public byte[] featureId;
@ApiModelProperty(value ="特征码字节数组,为{@code null}时返回false" ,required=true ,dataType="byte[]")
public byte[] feature;
@ApiModelProperty(value ="特征所属图的MD5(32字节HEX字符串),可为null" ,required=true ,dataType="String")
public String imgMD5;
}
/**
* argClass-2
* wrap arguments for method {@link #addFeature(AddFeatureToFseWithAppIdArgs)}
*/
public static class AddFeatureToFseWithAppIdArgs{
@ApiModelProperty(value ="特征码ID(MD5校验码),为null时,native library会自动计算MD5作为特征码ID" ,required=true ,dataType="byte[]")
public byte[] featureId;
@ApiModelProperty(value ="特征码字节数组,为{@code null}时返回false" ,required=true ,dataType="byte[]")
public byte[] feature;
@ApiModelProperty(value ="应用id,由调用者定义,可为null" ,required=true ,dataType="long")
public long appid;
}
/**
* argClass-4
* wrap arguments for method {@link #getFeature(GetFeatureFromFseArgs)}
*/
public static class GetFeatureFromFseArgs{
@ApiModelProperty(value ="特征码ID,MD5校验码(16 bytes)" ,required=true ,dataType="byte[]")
public byte[] featureId;
}
/**
* argClass-5
* wrap arguments for method {@link #getFeatureByHex(GetFeatureByHexFromFseArgs)}
*/
public static class GetFeatureByHexFromFseArgs{
@ApiModelProperty(value ="特征码ID,MD5校验码(32字节HEX字符串)" ,required=true ,dataType="String")
public String featureId;
}
/**
* argClass-6
* wrap arguments for method {@link #removeFeature(RemoveFeatureFromFseArgs)}
*/
public static class RemoveFeatureFromFseArgs{
@ApiModelProperty(value ="特征码ID,MD5校验码(16 bytes)" ,required=true ,dataType="byte[]")
public byte[] featureId;
}
/**
* argClass-7
* wrap arguments for method {@link #removeFeatureByHex(RemoveFeatureByHexFromFseArgs)}
*/
public static class RemoveFeatureByHexFromFseArgs{
@ApiModelProperty(value ="特征码ID,MD5校验码(32字节HEX字符串)" ,required=true ,dataType="String")
public String featureId;
}
/**
* argClass-8
* wrap arguments for method {@link #searchCode(SearchCodeFromFseArgs)}
*/
public static class SearchCodeFromFseArgs{
@ApiModelProperty(value ="要比对的特征码" ,required=true ,dataType="byte[]")
public byte[] code;
@ApiModelProperty(value ="相似度阀值" ,required=true ,dataType="double")
public double sim;
@ApiModelProperty(value ="最大返回的记录数" ,required=true ,dataType="int")
public int rows;
}
/**
* 获取{@link FeatureSe}实例的接口,
* 用于应用层SPI方式提供{@link FeatureSe}实例
* @author guyadong
*
*/
public static interface InstanceSupplier{
FeatureSe instanceOfFeatureSe();
}
/**
* web响应数据接口
* @author guyadong
*
*/
public static interface Response{
/**
* 接口方法调用成功
* @param result 调用返回值
*/
void onComplete(Object result);
/**
* 接口方法调用成功,调用方法返回类型为void
*/
void onComplete();
/**
* 接口方法调用抛出异常
* @param e 异常
*/
void onError(Exception e);
}
/**
* 获取{@link Response}接口实例的工厂类接口
* @author guyadong
*
*/
public static interface ResponseFactory{
/**
* @return 返回新的{@link Response}接口实例
*/
Response newFeatureSeResponse();
}
/**
* {@link Response}默认实现
* @author guyadong
*
*/
public static class DefaultResponse implements Response{
private static boolean outStrackTrace = false;
private boolean success;
/** RPC调用的返回值 */
private Object result;
/** 异常信息 */
private String errorMessage;
/** 异常堆栈信息 */
private String stackTrace;
@Override
public void onComplete(Object result) {
this.success = true;
this.result = result;
}
@Override
public void onComplete() {
onComplete(null);
}
@Override
public void onError(Exception e) {
success = false;
errorMessage = e.getMessage();
if(errorMessage == null){
errorMessage = e.getClass().getSimpleName();
}
if(outStrackTrace){
StringWriter writer = new StringWriter();
e.printStackTrace(new PrintWriter(writer));
stackTrace = writer.toString();
}
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public String getStackTrace() {
return stackTrace;
}
public void setStackTrace(String stackTrace) {
this.stackTrace = stackTrace;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("DefaultResponse [success=");
builder.append(success);
builder.append(", ");
if (result != null) {
builder.append("result=");
builder.append(result);
builder.append(", ");
}
if (errorMessage != null) {
builder.append("errorMessage=");
builder.append(errorMessage);
builder.append(", ");
}
if (stackTrace != null) {
builder.append("stackTrace=");
builder.append(stackTrace);
}
builder.append("]");
return builder.toString();
}
/**
* 开启输出堆栈信息(默认为不开启)
* 开发时为了调试需要获取详细的异常堆栈信息可以开启
* @param outStrackTrace 要设置的 outStrackTrace
*/
public static void enableStrackTrace() {
outStrackTrace = true;
}
}
/**
* {@link ResponseFactory}接口默认实现
* @author guyadong
*
*/
public static class DefaultResponseFactory implements ResponseFactory{
@Override
public Response newFeatureSeResponse() {
return new DefaultResponse();
}
}
public static String DESCRIPTION = "特征码内存搜索引擎(feature search engine)接口
\n"
+" 提供高速的人脸特征相似度比对搜索/排序,支持多线程并行搜索,适用于百万级以上人脸库的快速搜索。
\n"
+" 1.使用 {@link #addFeature(byte[], byte[], String)}方法将特征添加到搜索引擎
\n"
+" 2.使用 {@link #searchCode(byte[], double, int)}在内存中搜索与指定特征相似的的特征返回搜索结果";
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy