use of com.dtflys.forest.interceptor.Interceptor in project forest by dromara.
the class ForestMethod method processMethodAnnotations.
/**
* 处理方法上的注解列表
*/
private void processMethodAnnotations() {
List<Annotation> annotationList = new LinkedList<>();
fetchAnnotationsFromClasses(annotationList, new Class[] { interfaceProxyHandler.getInterfaceClass() });
for (Annotation ann : method.getAnnotations()) {
annotationList.add(ann);
}
List<ForestAnnotation> requestAnns = new LinkedList<>();
List<ForestAnnotation> methodAnns = new LinkedList<>();
// 对注解分类
for (Annotation ann : annotationList) {
if (ann instanceof BaseRequest) {
continue;
}
Map<Annotation, Class<? extends Interceptor>> lifeCycleClassMap = getAnnotationLifeCycleClassMap(ann);
if (lifeCycleClassMap != null && !lifeCycleClassMap.isEmpty()) {
for (Map.Entry<Annotation, Class<? extends Interceptor>> entry : lifeCycleClassMap.entrySet()) {
Annotation subAnn = entry.getKey();
Class<? extends Interceptor> lifeCycleClass = entry.getValue();
if (RequestLifeCycle.class.isAssignableFrom(lifeCycleClass)) {
requestAnns.add(new ForestAnnotation(subAnn, lifeCycleClass));
} else {
methodAnns.add(new ForestAnnotation(subAnn, lifeCycleClass));
}
}
}
}
// 先添加请求类注解
addMetaRequestAnnotations(requestAnns);
// 再添加普通方法类注解
addMetaRequestAnnotations(methodAnns);
// 处理请求元信息
if (this.metaRequest != null) {
processMetaRequest(this.metaRequest);
}
returnClass = method.getReturnType();
}
use of com.dtflys.forest.interceptor.Interceptor in project forest by dromara.
the class ForestMethod method processBaseProperties.
private void processBaseProperties() {
MetaRequest baseMetaRequest = interfaceProxyHandler.getBaseMetaRequest();
String baseUrl = baseMetaRequest.getUrl();
if (StringUtils.isNotBlank(baseUrl)) {
baseUrlTemplate = makeURLTemplate(BaseRequest.class, "baseUrl", baseUrl);
}
String baseContentEncoding = baseMetaRequest.getContentEncoding();
if (StringUtils.isNotBlank(baseContentEncoding)) {
baseEncodeTemplate = makeTemplate(BaseRequest.class, "contentEncoding", baseContentEncoding);
}
String baseContentType = baseMetaRequest.getContentType();
if (StringUtils.isNotBlank(baseContentType)) {
baseContentTypeTemplate = makeTemplate(BaseRequest.class, "contentType", baseContentType);
}
String baseUserAgent = baseMetaRequest.getUserAgent();
if (StringUtils.isNotBlank(baseUserAgent)) {
baseUserAgentTemplate = makeTemplate(BaseRequest.class, "userAgent", baseUserAgent);
}
String baseCharset = baseMetaRequest.getCharset();
if (StringUtils.isNotBlank(baseCharset)) {
baseCharsetTemplate = makeTemplate(BaseRequest.class, "charset", baseCharset);
}
String baseSslProtocol = baseMetaRequest.getSslProtocol();
if (StringUtils.isNotBlank(baseSslProtocol)) {
baseSslProtocolTemplate = makeTemplate(BaseRequest.class, "sslProtocol", baseSslProtocol);
}
baseLogConfiguration = interfaceProxyHandler.getBaseLogConfiguration();
baseTimeout = baseMetaRequest.getTimeout();
baseConnectTimeout = baseMetaRequest.getConnectTimeout();
baseReadTimeout = baseMetaRequest.getReadTimeout();
baseRetryerClass = baseMetaRequest.getRetryer();
baseRetryCount = baseMetaRequest.getRetryCount();
baseMaxRetryInterval = baseMetaRequest.getMaxRetryInterval();
List<Class<? extends Interceptor>> globalInterceptorClasses = configuration.getInterceptors();
if (globalInterceptorClasses != null && globalInterceptorClasses.size() > 0) {
globalInterceptorList = new LinkedList<>();
for (Class clazz : globalInterceptorClasses) {
if (!Interceptor.class.isAssignableFrom(clazz) || clazz.isInterface()) {
throw new ForestRuntimeException("Class [" + clazz.getName() + "] is not a implement of [" + Interceptor.class.getName() + "] interface.");
}
Interceptor interceptor = interceptorFactory.getInterceptor(clazz);
globalInterceptorList.add(interceptor);
}
}
Class[] baseInterceptorClasses = baseMetaRequest.getInterceptor();
if (baseInterceptorClasses != null && baseInterceptorClasses.length > 0) {
baseInterceptorList = new LinkedList<>();
for (int cidx = 0, len = baseInterceptorClasses.length; cidx < len; cidx++) {
Class clazz = baseInterceptorClasses[cidx];
if (!Interceptor.class.isAssignableFrom(clazz) || clazz.isInterface()) {
throw new ForestRuntimeException("Class [" + clazz.getName() + "] is not a implement of [" + Interceptor.class.getName() + "] interface.");
}
Interceptor interceptor = interceptorFactory.getInterceptor(clazz);
baseInterceptorList.add(interceptor);
}
}
/*
List<Annotation> baseAnnotationList = interfaceProxyHandler.getBaseAnnotations();
List<ForestAnnotation> baseAnns = new LinkedList<>();
for (Annotation annotation : baseAnnotationList) {
Class interceptorClass = getAnnotationLifeCycleClass(annotation);
baseAnns.add(new ForestAnnotation(annotation, interceptorClass));
}
addMetaRequestAnnotations(baseAnns);
*/
}
use of com.dtflys.forest.interceptor.Interceptor in project forest by dromara.
the class ForestMethod method makeRequest.
/**
* 创建请求
* @param args 调用本对象对应方法时传入的参数数组
* @return Forest请求对象,{@link ForestRequest}类实例
*/
private ForestRequest makeRequest(Object[] args) {
MetaRequest baseMetaRequest = interfaceProxyHandler.getBaseMetaRequest();
ForestURL baseURL = null;
ForestQueryMap queries = new ForestQueryMap();
if (baseUrlTemplate != null) {
baseURL = baseUrlTemplate.render(args, queries);
}
if (urlTemplate == null) {
throw new ForestRuntimeException("request URL is empty");
}
ForestURL renderedURL = urlTemplate.render(args, queries);
ForestRequestType type = type(args);
String baseContentEncoding = null;
if (baseEncodeTemplate != null) {
baseContentEncoding = baseEncodeTemplate.render(args);
}
String contentEncoding = null;
if (encodeTemplate != null) {
contentEncoding = encodeTemplate.render(args);
}
String baseContentType = null;
if (baseContentTypeTemplate != null) {
baseContentType = baseContentTypeTemplate.render(args);
}
String baseUserAgent = null;
if (baseUserAgentTemplate != null) {
baseUserAgent = baseUserAgentTemplate.render(args);
}
String charset = null;
String renderedCharset = charsetTemplate.render(args);
if (StringUtils.isNotBlank(renderedCharset)) {
charset = renderedCharset;
} else if (baseCharsetTemplate != null) {
charset = baseCharsetTemplate.render(args);
} else if (StringUtils.isNotBlank(configuration.getCharset())) {
charset = configuration.getCharset();
}
String responseEncoding = null;
if (responseEncodingTemplate != null) {
responseEncoding = responseEncodingTemplate.render(args);
}
String sslProtocol = null;
String renderedSslProtocol = sslProtocolTemplate.render(args);
if (StringUtils.isNotBlank(renderedSslProtocol)) {
sslProtocol = renderedSslProtocol;
} else if (baseSslProtocolTemplate != null) {
sslProtocol = baseSslProtocolTemplate.render(args);
} else {
sslProtocol = configuration.getSslProtocol();
}
String renderedContentType = null;
if (contentTypeTemplate != null) {
renderedContentType = contentTypeTemplate.render(args).trim();
}
String renderedUserAgent = null;
if (userAgentTemplate != null) {
renderedUserAgent = userAgentTemplate.render(args).trim();
}
List<RequestNameValue> nameValueList = new ArrayList<>();
String[] headerArray = baseMetaRequest.getHeaders();
MappingTemplate[] baseHeaders = null;
if (headerArray != null && headerArray.length > 0) {
baseHeaders = new MappingTemplate[headerArray.length];
for (int j = 0; j < baseHeaders.length; j++) {
MappingTemplate header = new MappingTemplate(BaseRequest.class, "headers", this, headerArray[j], this, configuration.getProperties(), forestParameters);
baseHeaders[j] = header;
}
}
AddressSource addressSource = configuration.getBaseAddressSource();
ForestAddress address = configuration.getBaseAddress();
if (address == null) {
// 默认根地址
address = DEFAULT_ADDRESS;
}
ForestURL addressURL = null;
if (baseURL != null) {
renderedURL.setBaseURL(baseURL);
}
try {
addressURL = new ForestURL(new URL("http://localhost"));
addressURL.setBaseAddress(address);
renderedURL = renderedURL.mergeURLWith(addressURL);
} catch (MalformedURLException e) {
throw new ForestRuntimeException(e);
}
boolean autoRedirection = configuration.isAutoRedirection();
String bodyTypeName = "text";
if (bodyTypeTemplate != null) {
bodyTypeName = bodyTypeTemplate.render(args);
}
ForestDataType bodyType = ForestDataType.findByName(bodyTypeName);
// createExecutor and initialize http instance
ForestRequest<T> request = new ForestRequest(configuration, this, args);
request.url(renderedURL).type(type).bodyType(bodyType).addAllQuery(queries).charset(charset).autoRedirects(autoRedirection).setSslProtocol(sslProtocol).setLogConfiguration(logConfiguration).setAsync(async);
if (addressSource != null) {
address = addressSource.getAddress(request);
request.address(address);
}
if (StringUtils.isNotEmpty(responseEncoding)) {
request.setResponseEncode(responseEncoding);
}
if (StringUtils.isNotEmpty(renderedContentType)) {
request.setContentType(renderedContentType);
}
if (StringUtils.isNotEmpty(contentEncoding)) {
request.setContentEncoding(contentEncoding);
}
if (StringUtils.isNotEmpty(renderedUserAgent)) {
request.setUserAgent(renderedUserAgent);
}
for (int i = 0; i < namedParameters.size(); i++) {
MappingParameter parameter = namedParameters.get(i);
if (parameter.isObjectProperties()) {
int target = parameter.isUnknownTarget() ? type.getDefaultParamTarget() : parameter.getTarget();
Object obj = args[parameter.getIndex()];
if (obj == null && StringUtils.isNotEmpty(parameter.getDefaultValue())) {
obj = parameter.getConvertedDefaultValue(configuration.getJsonConverter());
}
if (parameter.isJsonParam()) {
String json = "";
if (obj != null) {
ForestJsonConverter jsonConverter = configuration.getJsonConverter();
obj = parameter.getFilterChain().doFilter(configuration, obj);
json = jsonConverter.encodeToString(obj);
}
if (MappingParameter.isHeader(target)) {
request.addHeader(new RequestNameValue(parameter.getJsonParamName(), json, target).setDefaultValue(parameter.getDefaultValue()));
} else {
nameValueList.add(new RequestNameValue(parameter.getJsonParamName(), json, target, parameter.getPartContentType()).setDefaultValue(parameter.getDefaultValue()));
}
} else if (!parameter.getFilterChain().isEmpty()) {
obj = parameter.getFilterChain().doFilter(configuration, obj);
if (obj == null && StringUtils.isNotEmpty(parameter.getDefaultValue())) {
obj = parameter.getDefaultValue();
}
if (obj != null) {
if (MappingParameter.isHeader(target)) {
request.addHeader(new RequestNameValue(null, obj, target));
} else if (MappingParameter.isQuery(target)) {
request.addQuery(obj.toString(), (Object) null, parameter.isUrlEncode(), parameter.getCharset());
} else if (MappingParameter.isBody(target)) {
ForestRequestBody body = RequestBodyBuilder.type(obj.getClass()).build(obj, parameter.getDefaultValue());
request.addBody(body);
} else {
nameValueList.add(new RequestNameValue(obj.toString(), target, parameter.getPartContentType()).setDefaultValue(parameter.getDefaultValue()));
}
}
} else if (obj instanceof CharSequence) {
if (MappingParameter.isQuery(target)) {
request.addQuery(ForestQueryParameter.createSimpleQueryParameter(obj).setDefaultValue(parameter.getDefaultValue()));
} else if (MappingParameter.isBody(target)) {
request.addBody(new StringRequestBody(obj.toString()).setDefaultValue(parameter.getDefaultValue()));
}
} else if (obj instanceof Map) {
Map map = (Map) obj;
if (MappingParameter.isQuery(target)) {
request.addQuery(map, parameter.isUrlEncode(), parameter.getCharset());
} else if (MappingParameter.isBody(target)) {
request.addBody(map, parameter.getPartContentType());
} else if (MappingParameter.isHeader(target)) {
request.addHeader(map);
}
} else if (obj instanceof Iterable || (obj != null && (obj.getClass().isArray() || ReflectUtils.isPrimaryType(obj.getClass())))) {
if (MappingParameter.isQuery(target)) {
if (parameter.isJsonParam()) {
request.addQuery(parameter.getName(), obj, parameter.isUrlEncode(), parameter.getCharset());
} else {
if (obj instanceof Iterable) {
for (Object subItem : (Iterable) obj) {
if (subItem instanceof ForestQueryParameter) {
request.addQuery((ForestQueryParameter) subItem);
} else {
request.addQuery(ForestQueryParameter.createSimpleQueryParameter(subItem));
}
}
} else if (obj.getClass().isArray()) {
if (obj instanceof ForestQueryParameter[]) {
request.addQuery((ForestQueryParameter[]) obj);
}
}
}
} else if (MappingParameter.isBody(target)) {
ForestRequestBody body = RequestBodyBuilder.type(obj.getClass()).build(obj, parameter.getDefaultValue());
request.addBody(body);
}
} else if (MappingParameter.isBody(target)) {
ForestRequestBody body = RequestBodyBuilder.type(obj.getClass()).build(obj, parameter.getDefaultValue());
request.addBody(body);
} else {
try {
List<RequestNameValue> list = getNameValueListFromObjectWithJSON(parameter, configuration, obj, type);
for (RequestNameValue nameValue : list) {
if (nameValue.isInHeader()) {
request.addHeader(nameValue);
} else {
nameValueList.add(nameValue);
}
}
} catch (Throwable th) {
throw new ForestRuntimeException(th);
}
}
} else if (parameter.getIndex() != null) {
int target = parameter.isUnknownTarget() ? type.getDefaultParamTarget() : parameter.getTarget();
RequestNameValue nameValue = new RequestNameValue(parameter.getName(), target, parameter.getPartContentType()).setDefaultValue(parameter.getDefaultValue());
Object obj = args[parameter.getIndex()];
if (obj == null && StringUtils.isNotEmpty(nameValue.getDefaultValue())) {
obj = parameter.getConvertedDefaultValue(configuration.getJsonConverter());
}
if (obj != null) {
if (MappingParameter.isQuery(target) && obj.getClass().isArray() && !(obj instanceof byte[]) && !(obj instanceof Byte[])) {
int len = Array.getLength(obj);
for (int idx = 0; idx < len; idx++) {
Object arrayItem = Array.get(obj, idx);
ForestQueryParameter queryParameter = new ForestQueryParameter(parameter.getName(), arrayItem, parameter.isUrlEncode(), parameter.getCharset());
request.addQuery(queryParameter);
}
} else {
nameValue.setValue(obj);
if (MappingParameter.isHeader(target)) {
request.addHeader(nameValue);
} else if (MappingParameter.isQuery(target)) {
if (!parameter.isJsonParam() && obj instanceof Iterable) {
int index = 0;
MappingTemplate template = makeTemplate(parameter);
VariableScope parentScope = template.getVariableScope();
for (Object subItem : (Iterable) obj) {
SubVariableScope scope = new SubVariableScope(parentScope);
scope.addVariableValue("_it", subItem);
scope.addVariableValue("_index", index++);
template.setVariableScope(scope);
String name = template.render(args);
request.addQuery(name, subItem, parameter.isUrlEncode(), parameter.getCharset());
}
} else if (parameter.isJsonParam()) {
request.addJSONQuery(parameter.getName(), obj);
} else {
request.addQuery(parameter.getName(), obj, parameter.isUrlEncode(), parameter.getCharset());
}
} else {
MappingTemplate template = makeTemplate(parameter);
if (obj instanceof Iterable && template.hasIterateVariable()) {
int index = 0;
VariableScope parentScope = template.getVariableScope();
for (Object subItem : (Iterable) obj) {
SubVariableScope scope = new SubVariableScope(parentScope);
template.setVariableScope(scope);
scope.addVariableValue("_it", subItem);
scope.addVariableValue("_index", index++);
String name = template.render(args);
nameValueList.add(new RequestNameValue(name, subItem, target, parameter.getPartContentType()).setDefaultValue(parameter.getDefaultValue()));
}
} else {
nameValueList.add(nameValue);
}
}
}
}
}
}
if (request.getContentType() == null) {
if (StringUtils.isNotEmpty(baseContentType)) {
request.setContentType(baseContentType);
}
}
if (request.getContentEncoding() == null) {
if (StringUtils.isNotEmpty(baseContentEncoding)) {
request.setContentEncoding(baseContentEncoding);
}
}
if (request.getUserAgent() == null) {
if (StringUtils.isNotEmpty(baseUserAgent)) {
request.setUserAgent(baseUserAgent);
}
}
List<ForestMultipart> multiparts = new ArrayList<>(multipartFactories.size());
String contentType = request.getContentType();
if (!multipartFactories.isEmpty()) {
if (StringUtils.isBlank(contentType)) {
String boundary = StringUtils.generateBoundary();
request.setContentType(ContentType.MULTIPART_FORM_DATA + "; boundary=" + boundary);
} else if (ContentType.MULTIPART_FORM_DATA.equalsIgnoreCase(contentType) && request.getBoundary() == null) {
request.setBoundary(StringUtils.generateBoundary());
}
}
for (int i = 0; i < multipartFactories.size(); i++) {
ForestMultipartFactory factory = multipartFactories.get(i);
MappingTemplate nameTemplate = factory.getNameTemplate();
MappingTemplate fileNameTemplate = factory.getFileNameTemplate();
int index = factory.getIndex();
Object data = args[index];
factory.addMultipart(nameTemplate, fileNameTemplate, data, multiparts, args);
}
request.setMultiparts(multiparts);
// setup ssl keystore
if (sslKeyStoreId != null) {
SSLKeyStore sslKeyStore = null;
String keyStoreId = sslKeyStoreId.render(args);
if (StringUtils.isNotEmpty(keyStoreId)) {
sslKeyStore = configuration.getKeyStore(keyStoreId);
request.setKeyStore(sslKeyStore);
}
}
if (encoder != null) {
request.setEncoder(encoder);
}
if (decoder != null) {
request.setDecoder(decoder);
}
if (progressStep >= 0) {
request.setProgressStep(progressStep);
}
if (configuration.getDefaultParameters() != null) {
request.addNameValue(configuration.getDefaultParameters());
}
if (baseHeaders != null && baseHeaders.length > 0) {
for (MappingTemplate baseHeader : baseHeaders) {
String headerText = baseHeader.render(args);
String[] headerNameValue = headerText.split(":", 2);
if (headerNameValue.length > 1) {
String name = headerNameValue[0].trim();
if (request.getHeader(name) == null) {
request.addHeader(name, headerNameValue[1].trim());
}
}
}
}
if (configuration.getDefaultHeaders() != null) {
request.addHeaders(configuration.getDefaultHeaders());
}
List<RequestNameValue> dataNameValueList = new ArrayList<>();
renderedContentType = request.getContentType();
if (renderedContentType == null || renderedContentType.equalsIgnoreCase(ContentType.APPLICATION_X_WWW_FORM_URLENCODED)) {
for (int i = 0; i < dataTemplateArray.length; i++) {
MappingTemplate dataTemplate = dataTemplateArray[i];
String data = dataTemplate.render(args);
String[] paramArray = data.split("&");
for (int j = 0; j < paramArray.length; j++) {
String dataParam = paramArray[j];
String[] dataNameValue = dataParam.split("=", 2);
if (dataNameValue.length > 0) {
String name = dataNameValue[0].trim();
RequestNameValue nameValue = new RequestNameValue(name, type.getDefaultParamTarget());
if (dataNameValue.length == 2) {
nameValue.setValue(dataNameValue[1].trim());
}
nameValueList.add(nameValue);
dataNameValueList.add(nameValue);
}
}
}
} else {
for (int i = 0; i < dataTemplateArray.length; i++) {
MappingTemplate dataTemplate = dataTemplateArray[i];
String data = dataTemplate.render(args);
request.addBody(data);
}
}
request.addNameValue(nameValueList);
for (int i = 0; i < headerTemplateArray.length; i++) {
MappingTemplate headerTemplate = headerTemplateArray[i];
String header = headerTemplate.render(args);
String[] headNameValue = header.split(":", 2);
if (headNameValue.length > 0) {
String name = headNameValue[0].trim();
RequestNameValue nameValue = new RequestNameValue(name, TARGET_HEADER);
if (headNameValue.length == 2) {
nameValue.setValue(headNameValue[1].trim());
}
request.addHeader(nameValue);
}
}
if (timeout != null) {
request.setTimeout(timeout);
} else if (baseTimeout != null) {
request.setTimeout(baseTimeout);
} else if (configuration.getTimeout() != null) {
request.setTimeout(configuration.getTimeout());
}
if (connectTimeout != null) {
request.setConnectTimeout(connectTimeout);
} else if (baseConnectTimeout != null) {
request.setConnectTimeout(baseConnectTimeout);
} else if (configuration.getConnectTimeout() != null) {
request.setConnectTimeout(configuration.getConnectTimeout());
}
if (readTimeout != null) {
request.setReadTimeout(readTimeout);
} else if (baseReadTimeout != null) {
request.setReadTimeout(baseReadTimeout);
} else if (configuration.getReadTimeout() != null) {
request.setReadTimeout(configuration.getReadTimeout());
}
if (retryCount != null) {
request.setMaxRetryCount(retryCount);
} else if (baseRetryCount != null) {
request.setMaxRetryCount(baseRetryCount);
} else if (configuration.getMaxRetryCount() != null) {
request.setMaxRetryCount(configuration.getMaxRetryCount());
}
if (maxRetryInterval >= 0) {
request.setMaxRetryInterval(maxRetryInterval);
} else if (baseMaxRetryInterval != null) {
request.setMaxRetryInterval(baseMaxRetryInterval);
} else if (configuration.getMaxRetryInterval() >= 0) {
request.setMaxRetryInterval(configuration.getMaxRetryInterval());
}
Class globalRetryerClass = configuration.getRetryer();
if (retryerClass != null && ForestRetryer.class.isAssignableFrom(retryerClass)) {
request.setRetryer(retryerClass);
} else if (baseRetryerClass != null && ForestRetryer.class.isAssignableFrom(baseRetryerClass)) {
request.setRetryer(baseRetryerClass);
} else if (globalRetryerClass != null && ForestRetryer.class.isAssignableFrom(globalRetryerClass)) {
request.setRetryer(globalRetryerClass);
}
if (onSuccessParameter != null) {
OnSuccess<?> onSuccessCallback = (OnSuccess<?>) args[onSuccessParameter.getIndex()];
request.setOnSuccess(onSuccessCallback);
}
if (onErrorParameter != null) {
OnError onErrorCallback = (OnError) args[onErrorParameter.getIndex()];
request.setOnError(onErrorCallback);
}
if (onRedirectionParameter != null) {
OnRedirection onRedirectionCallback = (OnRedirection) args[onRedirectionParameter.getIndex()];
request.setOnRedirection(onRedirectionCallback);
}
if (onProgressParameter != null) {
OnProgress onProgressCallback = (OnProgress) args[onProgressParameter.getIndex()];
request.setOnProgress(onProgressCallback);
}
if (onSaveCookieParameter != null) {
OnSaveCookie onSaveCookieCallback = (OnSaveCookie) args[onSaveCookieParameter.getIndex()];
request.setOnSaveCookie(onSaveCookieCallback);
}
if (onLoadCookieParameter != null) {
OnLoadCookie onLoadCookieCallback = (OnLoadCookie) args[onLoadCookieParameter.getIndex()];
request.setOnLoadCookie(onLoadCookieCallback);
}
String dataType = dataTypeTemplate.render(args);
if (StringUtils.isEmpty(dataType)) {
request.setDataType(ForestDataType.TEXT);
} else {
dataType = dataType.toUpperCase();
ForestDataType forestDataType = ForestDataType.findByName(dataType);
request.setDataType(forestDataType);
}
if (interceptorAttributesList != null && interceptorAttributesList.size() > 0) {
for (InterceptorAttributes attributes : interceptorAttributesList) {
InterceptorAttributes newAttrs = attributes.clone();
request.addInterceptorAttributes(newAttrs.getInterceptorClass(), newAttrs);
request.getInterceptorAttributes(newAttrs.getInterceptorClass()).render(args);
}
}
if (globalInterceptorList != null && globalInterceptorList.size() > 0) {
for (Interceptor item : globalInterceptorList) {
request.addInterceptor(item);
}
}
if (baseInterceptorList != null && baseInterceptorList.size() > 0) {
for (Interceptor item : baseInterceptorList) {
request.addInterceptor(item);
}
}
if (interceptorList != null && interceptorList.size() > 0) {
for (Interceptor item : interceptorList) {
request.addInterceptor(item);
}
}
return request;
}
use of com.dtflys.forest.interceptor.Interceptor in project forest by dromara.
the class ForestMethod method getAnnotationLifeCycleClassMap.
private Map<Annotation, Class<? extends Interceptor>> getAnnotationLifeCycleClassMap(Annotation annotation) {
Class<? extends Annotation> annType = annotation.annotationType();
if (annType.getPackage().getName().startsWith("java.")) {
return null;
}
Map<Annotation, Class<? extends Interceptor>> resultMap = new LinkedHashMap<>();
Annotation[] annArray = annType.getAnnotations();
for (Annotation ann : annArray) {
Map<Annotation, Class<? extends Interceptor>> parentMap = getAnnotationLifeCycleClassMap(ann);
if (parentMap != null && !parentMap.isEmpty()) {
resultMap.putAll(parentMap);
}
}
Class<? extends Interceptor> lifeCycleClass = getAnnotationLifeCycleClass(annotation);
if (lifeCycleClass != null) {
resultMap.put(annotation, lifeCycleClass);
}
return resultMap;
}
use of com.dtflys.forest.interceptor.Interceptor in project forest by dromara.
the class TestInterceptorChain method testInterceptorChain.
@Test
public void testInterceptorChain() {
final AtomicInteger count = new AtomicInteger(0);
final AtomicBoolean inter1Before = new AtomicBoolean(false);
final AtomicBoolean inter2Before = new AtomicBoolean(false);
final AtomicBoolean inter3Before = new AtomicBoolean(false);
final AtomicBoolean inter1Success = new AtomicBoolean(false);
final AtomicBoolean inter2Success = new AtomicBoolean(false);
final AtomicBoolean inter1Error = new AtomicBoolean(false);
final AtomicBoolean inter2Error = new AtomicBoolean(false);
final AtomicBoolean inter1After = new AtomicBoolean(false);
final AtomicBoolean inter2After = new AtomicBoolean(false);
final AtomicBoolean only2After = new AtomicBoolean(false);
Interceptor interceptor1 = new Interceptor() {
@Override
public boolean beforeExecute(ForestRequest request) {
inter1Before.set(true);
return true;
}
@Override
public void onSuccess(Object data, ForestRequest request, ForestResponse response) {
inter1Success.set(true);
count.incrementAndGet();
}
@Override
public void onError(ForestRuntimeException ex, ForestRequest request, ForestResponse response) {
inter1Error.set(true);
}
@Override
public void afterExecute(ForestRequest request, ForestResponse response) {
inter1After.set(true);
}
};
Interceptor interceptor2 = new Interceptor() {
@Override
public boolean beforeExecute(ForestRequest request) {
inter2Before.set(true);
return true;
}
@Override
public void onSuccess(Object data, ForestRequest request, ForestResponse response) {
inter2Success.set(true);
count.incrementAndGet();
}
@Override
public void onError(ForestRuntimeException ex, ForestRequest request, ForestResponse response) {
inter2Error.set(true);
}
@Override
public void afterExecute(ForestRequest request, ForestResponse response) {
inter2After.set(true);
only2After.set(true);
}
};
Interceptor interceptor3 = new Interceptor() {
@Override
public boolean beforeExecute(ForestRequest request) {
inter3Before.set(true);
return false;
}
@Override
public void onSuccess(Object data, ForestRequest request, ForestResponse response) {
}
@Override
public void onError(ForestRuntimeException ex, ForestRequest request, ForestResponse response) {
}
@Override
public void afterExecute(ForestRequest request, ForestResponse response) {
}
};
InterceptorChain chain = new InterceptorChain();
chain.addInterceptor(interceptor1).addInterceptor(interceptor2);
assertEquals(2, chain.getInterceptorSize());
assertTrue(chain.beforeExecute(null));
assertTrue(inter1Before.get());
assertTrue(inter2Before.get());
chain.addInterceptor(interceptor3);
assertFalse(inter3Before.get());
chain.onSuccess(null, null, null);
assertTrue(inter1Success.get());
assertTrue(inter2Success.get());
assertEquals(2, count.get());
chain.onError(null, null, null);
assertTrue(inter1Error.get());
assertTrue(inter2Error.get());
chain.afterExecute(null, null);
assertTrue(inter1After.get());
assertTrue(inter2After.get());
assertTrue(only2After.get());
}
Aggregations