001// ______________________________________________________ 002// Generated by codegen - https://gitee.com/l0km/codegen 003// template: decorator/spring.controller.class.vm 004// ______________________________________________________ 005/** 006 * decorator pattern 装饰者模å¼ä»£ç†{@link FeatureSe}接å£<br> 007 * å°†{@link FeatureSe}实例å°è£…为一个spring controler<br> 008 * 计算机生æˆä»£ç (generated by automated tools DecoratorGenerator @author guyadong)<br> 009 * @author guyadong 010 * 011 */ 012package net.gdface.sdk.fse; 013import java.util.ServiceLoader; 014import java.io.PrintWriter; 015import java.io.StringWriter; 016import java.util.Iterator; 017import java.util.Objects; 018 019import org.slf4j.Logger; 020import org.slf4j.LoggerFactory; 021import org.springframework.web.bind.annotation.*; 022import io.swagger.annotations.*; 023 024/** 025 * 特å¾ç å†…å˜æœç´¢å¼•擎(feature search engine)接å£<br> 026 * æä¾›é«˜é€Ÿçš„人脸特å¾ç›¸ä¼¼åº¦æ¯”对æœç´¢/排åº,支æŒå¤šçº¿ç¨‹å¹¶è¡Œæœç´¢ï¼Œé€‚用于百万级以上人脸库的快速æœç´¢ã€‚<br> 027 * 1.使用 {@link #addFeature(byte[], byte[], String)}æ–¹æ³•å°†ç‰¹å¾æ·»åŠ åˆ°æœç´¢å¼•擎<br> 028 * 2.使用 {@link #searchCode(byte[], double, int)}在内å˜ä¸æœç´¢ä¸ŽæŒ‡å®šç‰¹å¾ç›¸ä¼¼çš„的特å¾è¿”回æœç´¢ç»“æžœ 029 * @author guyadong 030 */ 031@RestController 032@Api(value="FeatureSe",tags={"FeatureSe Controller"}) 033public class FeatureSeSpringController { 034 private static final Logger logger = LoggerFactory.getLogger(FeatureSeSpringController.class); 035 private static InstanceSupplier instanceSupplier = getInstanceSupplier(); 036 private final ResponseFactory responseFactory = loadResponseFactory(); 037 /** 038 * SPI(Service Provider Interface)æœºåˆ¶åŠ è½½ {@link InstanceSupplier}实例,没有找到则返回{@code null}, 039 * 返回{@link InstanceSupplier}æä¾›çš„{@link FeatureSe}实例 040 * @return 返回{@link FeatureSe}实例 041 */ 042 private static final InstanceSupplier getInstanceSupplier() { 043 /* SPI(Service Provider Interface)æœºåˆ¶åŠ è½½ {@link InstanceSupplier}实例,没有找到则抛出异常 */ 044 ServiceLoader<InstanceSupplier> providers = ServiceLoader.load(InstanceSupplier.class); 045 Iterator<InstanceSupplier> itor = providers.iterator(); 046 return itor.hasNext() ? itor.next() : null; 047 } 048 /** 049 * @param instanceSupplier è¦è®¾ç½®çš„ instanceSupplier 050 */ 051 public static void setInstanceSupplier(InstanceSupplier instanceSupplier) { 052 FeatureSeSpringController.instanceSupplier = instanceSupplier; 053 } 054 /** 055 * SPI(Service Provider Interface)åŠ è½½{@link ResponseFactory}接å£å®žä¾‹, 056 * 没有找到则返回{@link DefaultResponseFactory}实例 057 * @return 返回{@link ResponseFactory}实例 058 */ 059 private static final ResponseFactory loadResponseFactory() { 060 ServiceLoader<ResponseFactory> providers = ServiceLoader.load(ResponseFactory.class); 061 Iterator<ResponseFactory> itor = providers.iterator(); 062 return itor.hasNext() ? itor.next() : new DefaultResponseFactory(); 063 } 064 public FeatureSeSpringController() { 065 } 066 067 /** 068 * @return 返回被装饰的{@link FeatureSe}实例 069 */ 070 protected FeatureSe delegate() { 071 return Objects.requireNonNull( 072 instanceSupplier == null ? null : instanceSupplier.instanceOfFeatureSe(), 073 "FeatureSe instance is null" ); 074 } 075 // port-1 076 /** 077 * æ·»åŠ ä¸€æ¡ç‰¹å¾ç 到内å˜è¡¨<br> 078 * @param featureId 特å¾ç ID(MD5æ ¡éªŒç ),为nullæ—¶,native library会自动计算MD5作为特å¾ç ID 079 * @param feature 特å¾ç å—节数组,为{@code null}时返回false 080 * @param imgMD5 ç‰¹å¾æ‰€å±žå›¾çš„MD5(32å—节HEXå—符串),å¯ä¸ºnull 081 * @return æ·»åŠ æˆåŠŸè¿”å›žtrue, å¦åˆ™è¿”回false 082 */ 083 @ResponseBody 084 @RequestMapping(value = "/FeatureSe/addFeatureToFse", method = RequestMethod.POST) 085 @ApiOperation(value = "æ·»åŠ ä¸€æ¡ç‰¹å¾ç 到内å˜è¡¨<br>", notes = "æ·»åŠ ä¸€æ¡ç‰¹å¾ç 到内å˜è¡¨<br>",httpMethod="POST") 086 public Response addFeature( @RequestBody AddFeatureToFseArgs args) 087 { 088 Response response = responseFactory.newFeatureSeResponse(); 089 try{ 090 response.onComplete(delegate().addFeature(args.featureId,args.feature,args.imgMD5)); 091 } 092 catch(Exception e){ 093 logger.error(e.getMessage(),e); 094 response.onError(e); 095 } 096 return response; 097 } 098 // port-2 099 /** 100 * æ·»åŠ ä¸€æ¡ç‰¹å¾ç 到内å˜è¡¨<br> 101 * @param featureId 特å¾ç ID(MD5æ ¡éªŒç ),为nullæ—¶,native library会自动计算MD5作为特å¾ç ID 102 * @param feature 特å¾ç å—节数组,为{@code null}时返回false 103 * @param appid 应用id,由调用者定义,å¯ä¸ºnull 104 * @return æ·»åŠ æˆåŠŸè¿”å›žtrue, å¦åˆ™è¿”回false 105 */ 106 @ResponseBody 107 @RequestMapping(value = "/FeatureSe/addFeatureToFseWithAppId", method = RequestMethod.POST) 108 @ApiOperation(value = "æ·»åŠ ä¸€æ¡ç‰¹å¾ç 到内å˜è¡¨<br>", notes = "æ·»åŠ ä¸€æ¡ç‰¹å¾ç 到内å˜è¡¨<br>",httpMethod="POST") 109 public Response addFeature( @RequestBody AddFeatureToFseWithAppIdArgs args) 110 { 111 Response response = responseFactory.newFeatureSeResponse(); 112 try{ 113 response.onComplete(delegate().addFeature(args.featureId,args.feature,args.appid)); 114 } 115 catch(Exception e){ 116 logger.error(e.getMessage(),e); 117 response.onError(e); 118 } 119 return response; 120 } 121 // port-3 122 /** 123 * åˆ é™¤å†…å˜è¡¨ä¸æ‰€æœ‰ç‰¹å¾æ•°æ® 124 */ 125 @ResponseBody 126 @RequestMapping(value = "/FeatureSe/clearAllOfFse", method = RequestMethod.POST) 127 @ApiOperation(value = "åˆ é™¤å†…å˜è¡¨ä¸æ‰€æœ‰ç‰¹å¾æ•°æ®", notes = "åˆ é™¤å†…å˜è¡¨ä¸æ‰€æœ‰ç‰¹å¾æ•°æ®",httpMethod="POST") 128 public Response clearAll() 129 { 130 Response response = responseFactory.newFeatureSeResponse(); 131 try{ 132 delegate().clearAll(); 133 response.onComplete(); 134 } 135 catch(Exception e){ 136 logger.error(e.getMessage(),e); 137 response.onError(e); 138 } 139 return response; 140 } 141 // port-4 142 /** 143 * æ ¹æ®ç‰¹å¾ç IDåœ¨è¡¨ä¸æŸ¥æ‰¾æŒ‡å®šçš„记录 144 * @param featureId 特å¾ç ID,MD5æ ¡éªŒç (16 bytes) 145 * @return 返回指定的特å¾è®°å½•,没有找到则返回{@code null},{@code featureId}为{@code null}或空返回{@code null} 146 */ 147 @ResponseBody 148 @RequestMapping(value = "/FeatureSe/getFeatureFromFse", method = RequestMethod.POST) 149 @ApiOperation(value = "æ ¹æ®ç‰¹å¾ç IDåœ¨è¡¨ä¸æŸ¥æ‰¾æŒ‡å®šçš„记录", notes = "æ ¹æ®ç‰¹å¾ç IDåœ¨è¡¨ä¸æŸ¥æ‰¾æŒ‡å®šçš„记录",httpMethod="POST") 150 public Response getFeature( @RequestBody GetFeatureFromFseArgs args) 151 { 152 Response response = responseFactory.newFeatureSeResponse(); 153 try{ 154 response.onComplete(delegate().getFeature(args.featureId)); 155 } 156 catch(Exception e){ 157 logger.error(e.getMessage(),e); 158 response.onError(e); 159 } 160 return response; 161 } 162 // port-5 163 /** 164 * æ ¹æ®ç‰¹å¾ç IDåœ¨è¡¨ä¸æŸ¥æ‰¾æŒ‡å®šçš„记录 165 * @param featureId 特å¾ç ID,MD5æ ¡éªŒç (32å—节HEXå—符串) 166 * @return 返回指定的特å¾è®°å½•,没有找到则返回{@code null},{@code featureId}为{@code null}或空返回{@code null} 167 */ 168 @ResponseBody 169 @RequestMapping(value = "/FeatureSe/getFeatureByHexFromFse", method = RequestMethod.POST) 170 @ApiOperation(value = "æ ¹æ®ç‰¹å¾ç IDåœ¨è¡¨ä¸æŸ¥æ‰¾æŒ‡å®šçš„记录", notes = "æ ¹æ®ç‰¹å¾ç IDåœ¨è¡¨ä¸æŸ¥æ‰¾æŒ‡å®šçš„记录",httpMethod="POST") 171 public Response getFeatureByHex( @RequestBody GetFeatureByHexFromFseArgs args) 172 { 173 Response response = responseFactory.newFeatureSeResponse(); 174 try{ 175 response.onComplete(delegate().getFeatureByHex(args.featureId)); 176 } 177 catch(Exception e){ 178 logger.error(e.getMessage(),e); 179 response.onError(e); 180 } 181 return response; 182 } 183 // port-6 184 /** 185 * æ ¹æ®ç‰¹å¾ç IDä¸è¡¨ä¸åˆ 除指定的记录 186 * @param featureId 特å¾ç ID,MD5æ ¡éªŒç (16 bytes) 187 * @return æˆåŠŸåˆ é™¤åˆ™è¿”å›žtrue,å¦åˆ™è¿”回false 188 */ 189 @ResponseBody 190 @RequestMapping(value = "/FeatureSe/removeFeatureFromFse", method = RequestMethod.POST) 191 @ApiOperation(value = "æ ¹æ®ç‰¹å¾ç IDä¸è¡¨ä¸åˆ 除指定的记录", notes = "æ ¹æ®ç‰¹å¾ç IDä¸è¡¨ä¸åˆ 除指定的记录",httpMethod="POST") 192 public Response removeFeature( @RequestBody RemoveFeatureFromFseArgs args) 193 { 194 Response response = responseFactory.newFeatureSeResponse(); 195 try{ 196 response.onComplete(delegate().removeFeature(args.featureId)); 197 } 198 catch(Exception e){ 199 logger.error(e.getMessage(),e); 200 response.onError(e); 201 } 202 return response; 203 } 204 // port-7 205 /** 206 * æ ¹æ®ç‰¹å¾ç IDä¸è¡¨ä¸åˆ 除指定的记录 207 * @param featureId 特å¾ç ID,MD5æ ¡éªŒç (32å—节HEXå—符串) 208 * @return æˆåŠŸåˆ é™¤åˆ™è¿”å›žtrue,å¦åˆ™è¿”回false 209 */ 210 @ResponseBody 211 @RequestMapping(value = "/FeatureSe/removeFeatureByHexFromFse", method = RequestMethod.POST) 212 @ApiOperation(value = "æ ¹æ®ç‰¹å¾ç IDä¸è¡¨ä¸åˆ 除指定的记录", notes = "æ ¹æ®ç‰¹å¾ç IDä¸è¡¨ä¸åˆ 除指定的记录",httpMethod="POST") 213 public Response removeFeatureByHex( @RequestBody RemoveFeatureByHexFromFseArgs args) 214 { 215 Response response = responseFactory.newFeatureSeResponse(); 216 try{ 217 response.onComplete(delegate().removeFeatureByHex(args.featureId)); 218 } 219 catch(Exception e){ 220 logger.error(e.getMessage(),e); 221 response.onError(e); 222 } 223 return response; 224 } 225 // port-8 226 /** 227 * 在内å˜è¡¨ä¸æ ¹æ®æ¯”对相似度进行特å¾ç æœç´¢ 228 * @param code è¦æ¯”对的特å¾ç 229 * @param sim 相似度阀值 230 * @param rows 最大返回的记录数 231 * @return 返回包å«ç›¸ä¼¼åº¦(é™åº)的结果数组,如果没有查到匹é…的记录则返回空数组 232 */ 233 @ResponseBody 234 @RequestMapping(value = "/FeatureSe/searchCodeFromFse", method = RequestMethod.POST) 235 @ApiOperation(value = "在内å˜è¡¨ä¸æ ¹æ®æ¯”对相似度进行特å¾ç æœç´¢", notes = "在内å˜è¡¨ä¸æ ¹æ®æ¯”对相似度进行特å¾ç æœç´¢",httpMethod="POST") 236 public Response searchCode( @RequestBody SearchCodeFromFseArgs args) 237 { 238 Response response = responseFactory.newFeatureSeResponse(); 239 try{ 240 response.onComplete(delegate().searchCode(args.code,args.sim,args.rows)); 241 } 242 catch(Exception e){ 243 logger.error(e.getMessage(),e); 244 response.onError(e); 245 } 246 return response; 247 } 248 // port-9 249 /** 250 * @return 内å˜è¡¨ä¸å…ƒç´ 个数 251 */ 252 @ResponseBody 253 @RequestMapping(value = "/FeatureSe/sizeOfFse", method = RequestMethod.POST) 254 @ApiOperation(value = "", notes = "",httpMethod="POST") 255 public Response size() 256 { 257 Response response = responseFactory.newFeatureSeResponse(); 258 try{ 259 response.onComplete(delegate().size()); 260 } 261 catch(Exception e){ 262 logger.error(e.getMessage(),e); 263 response.onError(e); 264 } 265 return response; 266 } 267 /** 268 * argClass-1<br> 269 * wrap arguments for method {@link #addFeature(AddFeatureToFseArgs)} 270 */ 271 public static class AddFeatureToFseArgs{ 272 @ApiModelProperty(value ="特å¾ç ID(MD5æ ¡éªŒç ),为nullæ—¶,native library会自动计算MD5作为特å¾ç ID" ,required=true ,dataType="byte[]") 273 public byte[] featureId; 274 @ApiModelProperty(value ="特å¾ç å—节数组,为{@code null}时返回false" ,required=true ,dataType="byte[]") 275 public byte[] feature; 276 @ApiModelProperty(value ="ç‰¹å¾æ‰€å±žå›¾çš„MD5(32å—节HEXå—符串),å¯ä¸ºnull" ,required=true ,dataType="String") 277 public String imgMD5; 278 } 279 /** 280 * argClass-2<br> 281 * wrap arguments for method {@link #addFeature(AddFeatureToFseWithAppIdArgs)} 282 */ 283 public static class AddFeatureToFseWithAppIdArgs{ 284 @ApiModelProperty(value ="特å¾ç ID(MD5æ ¡éªŒç ),为nullæ—¶,native library会自动计算MD5作为特å¾ç ID" ,required=true ,dataType="byte[]") 285 public byte[] featureId; 286 @ApiModelProperty(value ="特å¾ç å—节数组,为{@code null}时返回false" ,required=true ,dataType="byte[]") 287 public byte[] feature; 288 @ApiModelProperty(value ="应用id,由调用者定义,å¯ä¸ºnull" ,required=true ,dataType="long") 289 public long appid; 290 } 291 /** 292 * argClass-4<br> 293 * wrap arguments for method {@link #getFeature(GetFeatureFromFseArgs)} 294 */ 295 public static class GetFeatureFromFseArgs{ 296 @ApiModelProperty(value ="特å¾ç ID,MD5æ ¡éªŒç (16 bytes)" ,required=true ,dataType="byte[]") 297 public byte[] featureId; 298 } 299 /** 300 * argClass-5<br> 301 * wrap arguments for method {@link #getFeatureByHex(GetFeatureByHexFromFseArgs)} 302 */ 303 public static class GetFeatureByHexFromFseArgs{ 304 @ApiModelProperty(value ="特å¾ç ID,MD5æ ¡éªŒç (32å—节HEXå—符串)" ,required=true ,dataType="String") 305 public String featureId; 306 } 307 /** 308 * argClass-6<br> 309 * wrap arguments for method {@link #removeFeature(RemoveFeatureFromFseArgs)} 310 */ 311 public static class RemoveFeatureFromFseArgs{ 312 @ApiModelProperty(value ="特å¾ç ID,MD5æ ¡éªŒç (16 bytes)" ,required=true ,dataType="byte[]") 313 public byte[] featureId; 314 } 315 /** 316 * argClass-7<br> 317 * wrap arguments for method {@link #removeFeatureByHex(RemoveFeatureByHexFromFseArgs)} 318 */ 319 public static class RemoveFeatureByHexFromFseArgs{ 320 @ApiModelProperty(value ="特å¾ç ID,MD5æ ¡éªŒç (32å—节HEXå—符串)" ,required=true ,dataType="String") 321 public String featureId; 322 } 323 /** 324 * argClass-8<br> 325 * wrap arguments for method {@link #searchCode(SearchCodeFromFseArgs)} 326 */ 327 public static class SearchCodeFromFseArgs{ 328 @ApiModelProperty(value ="è¦æ¯”对的特å¾ç " ,required=true ,dataType="byte[]") 329 public byte[] code; 330 @ApiModelProperty(value ="相似度阀值" ,required=true ,dataType="double") 331 public double sim; 332 @ApiModelProperty(value ="最大返回的记录数" ,required=true ,dataType="int") 333 public int rows; 334 } 335 /** 336 * 获å–{@link FeatureSe}实例的接å£ï¼Œ 337 * 用于应用层SPIæ–¹å¼æä¾›{@link FeatureSe}实例 338 * @author guyadong 339 * 340 */ 341 public static interface InstanceSupplier{ 342 FeatureSe instanceOfFeatureSe(); 343 } 344 /** 345 * webå“åº”æ•°æ®æŽ¥å£ 346 * @author guyadong 347 * 348 */ 349 public static interface Response{ 350 /** 351 * æŽ¥å£æ–¹æ³•调用æˆåŠŸ 352 * @param result 调用返回值 353 */ 354 void onComplete(Object result); 355 /** 356 * æŽ¥å£æ–¹æ³•调用æˆåŠŸï¼Œè°ƒç”¨æ–¹æ³•è¿”å›žç±»åž‹ä¸ºvoid 357 */ 358 void onComplete(); 359 /** 360 * æŽ¥å£æ–¹æ³•调用抛出异常 361 * @param e 异常 362 */ 363 void onError(Exception e); 364 } 365 /** 366 * 获å–{@link Response}接å£å®žä¾‹çš„å·¥åŽ‚ç±»æŽ¥å£ 367 * @author guyadong 368 * 369 */ 370 public static interface ResponseFactory{ 371 /** 372 * @return 返回新的{@link Response}接å£å®žä¾‹ 373 */ 374 Response newFeatureSeResponse(); 375 } 376 /** 377 * {@link Response}默认实现 378 * @author guyadong 379 * 380 */ 381 public static class DefaultResponse implements Response{ 382 private static boolean outStrackTrace = false; 383 private boolean success; 384 /** RPC调用的返回值 */ 385 private Object result; 386 /** å¼‚å¸¸ä¿¡æ¯ */ 387 private String errorMessage; 388 /** å¼‚å¸¸å †æ ˆä¿¡æ¯ */ 389 private String stackTrace; 390 @Override 391 public void onComplete(Object result) { 392 this.success = true; 393 this.result = result; 394 } 395 @Override 396 public void onComplete() { 397 onComplete(null); 398 } 399 @Override 400 public void onError(Exception e) { 401 success = false; 402 errorMessage = e.getMessage(); 403 if(errorMessage == null){ 404 errorMessage = e.getClass().getSimpleName(); 405 } 406 if(outStrackTrace){ 407 StringWriter writer = new StringWriter(); 408 e.printStackTrace(new PrintWriter(writer)); 409 stackTrace = writer.toString(); 410 } 411 } 412 413 public boolean isSuccess() { 414 return success; 415 } 416 417 public void setSuccess(boolean success) { 418 this.success = success; 419 } 420 421 public Object getResult() { 422 return result; 423 } 424 425 public void setResult(Object result) { 426 this.result = result; 427 } 428 429 public String getErrorMessage() { 430 return errorMessage; 431 } 432 433 public void setErrorMessage(String errorMessage) { 434 this.errorMessage = errorMessage; 435 } 436 437 public String getStackTrace() { 438 return stackTrace; 439 } 440 441 public void setStackTrace(String stackTrace) { 442 this.stackTrace = stackTrace; 443 } 444 445 @Override 446 public String toString() { 447 StringBuilder builder = new StringBuilder(); 448 builder.append("DefaultResponse [success="); 449 builder.append(success); 450 builder.append(", "); 451 if (result != null) { 452 builder.append("result="); 453 builder.append(result); 454 builder.append(", "); 455 } 456 if (errorMessage != null) { 457 builder.append("errorMessage="); 458 builder.append(errorMessage); 459 builder.append(", "); 460 } 461 if (stackTrace != null) { 462 builder.append("stackTrace="); 463 builder.append(stackTrace); 464 } 465 builder.append("]"); 466 return builder.toString(); 467 } 468 /** 469 * å¼€å¯è¾“å‡ºå †æ ˆä¿¡æ¯(默认为ä¸å¼€å¯)<br> 470 * 开呿—¶ä¸ºäº†è°ƒè¯•需è¦èŽ·å–è¯¦ç»†çš„å¼‚å¸¸å †æ ˆä¿¡æ¯å¯ä»¥å¼€å¯ 471 * @param outStrackTrace è¦è®¾ç½®çš„ outStrackTrace 472 */ 473 public static void enableStrackTrace() { 474 outStrackTrace = true; 475 } 476 } 477 /** 478 * {@link ResponseFactory}接å£é»˜è®¤å®žçް 479 * @author guyadong 480 * 481 */ 482 public static class DefaultResponseFactory implements ResponseFactory{ 483 484 @Override 485 public Response newFeatureSeResponse() { 486 return new DefaultResponse(); 487 } 488 } 489 public static String DESCRIPTION = "特å¾ç å†…å˜æœç´¢å¼•擎(feature search engine)接å£<br>\n" 490+" æä¾›é«˜é€Ÿçš„人脸特å¾ç›¸ä¼¼åº¦æ¯”对æœç´¢/排åº,支æŒå¤šçº¿ç¨‹å¹¶è¡Œæœç´¢ï¼Œé€‚用于百万级以上人脸库的快速æœç´¢ã€‚<br>\n" 491+" 1.使用 {@link #addFeature(byte[], byte[], String)}æ–¹æ³•å°†ç‰¹å¾æ·»åŠ åˆ°æœç´¢å¼•擎<br>\n" 492+" 2.使用 {@link #searchCode(byte[], double, int)}在内å˜ä¸æœç´¢ä¸ŽæŒ‡å®šç‰¹å¾ç›¸ä¼¼çš„的特å¾è¿”回æœç´¢ç»“æžœ"; 493}