Skip to content

Commit

Permalink
feat(内核): 简化处理器逻辑
Browse files Browse the repository at this point in the history
  • Loading branch information
qianmoQ committed Jan 17, 2025
1 parent 2174ee8 commit cebbc9e
Show file tree
Hide file tree
Showing 3 changed files with 160 additions and 121 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
package org.devlive.lightcall.processor;

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.devlive.lightcall.RequestContext;
import org.devlive.lightcall.RequestException;
import org.devlive.lightcall.handler.ParameterHandler;
import org.devlive.lightcall.handler.ParameterHandlerFactory;
import org.devlive.lightcall.interceptor.Interceptor;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.List;

@Slf4j
public abstract class AbstractMethodProcessor<A extends Annotation>
implements MethodProcessor<A>
{
protected final OkHttpClient client;
protected final ObjectMapper objectMapper;
protected final List<Interceptor> interceptors;

protected AbstractMethodProcessor(OkHttpClient client, ObjectMapper objectMapper, List<Interceptor> interceptors)
{
this.client = client;
this.objectMapper = objectMapper;
this.interceptors = interceptors;
}

@Override
public Object process(Object proxy, Method method, Object[] args, A annotation, RequestContext context)
throws Throwable
{
String path = getPath(annotation);
HttpUrl url = buildUrl(path, method, args, context);
Request request = buildRequest(url, context);
return executeRequest(request, method.getReturnType(), context);
}

protected abstract String getPath(A annotation);

protected abstract Request buildRequest(HttpUrl url, RequestContext context);

protected HttpUrl buildUrl(String path, Method method, Object[] args, RequestContext context)
{
log.debug("Building URL for path: {}", path);

List<ParameterHandler> handlers = ParameterHandlerFactory.createHandlers(method, context);
Parameter[] parameters = method.getParameters();
String processedPath = path;

for (int i = 0; i < parameters.length; i++) {
Parameter parameter = parameters[i];
Object arg = args[i];

for (ParameterHandler handler : handlers) {
if (handler.canHandle(parameter)) {
processedPath = handler.handle(parameter, arg, processedPath);
break;
}
}
}

if (!processedPath.startsWith("/")) {
processedPath = "/" + processedPath;
}
context.getUrlBuilder().addPathSegments(processedPath.substring(1));

HttpUrl url = context.getUrlBuilder().build();
log.debug("Built URL: {}", url);
return url;
}

protected <T> T executeRequest(Request request, Class<T> returnType, RequestContext context)
throws Exception
{
log.info("Executing request - URL: {}, Method: {}", request.url(), request.method());

Request interceptedRequest = applyBeforeRequestInterceptors(request);

long startTime = System.currentTimeMillis();
try {
Response response = client.newCall(interceptedRequest).execute();
long duration = System.currentTimeMillis() - startTime;
log.debug("Received response in {}ms - Status code: {}", duration, response.code());

response = applyAfterResponseInterceptors(response);

if (!response.isSuccessful()) {
throw new RequestException("Request failed with code: " + response.code());
}

if (response.body() == null) {
log.warn("Response body is null for URL: {}", request.url());
return null;
}

String responseBody = response.body().string();
response.close();

return objectMapper.readValue(responseBody, returnType);
}
catch (Exception e) {
log.error("Error executing request: {}", e.getMessage(), e);
throw e;
}
}

protected Request applyBeforeRequestInterceptors(Request request)
{
Request interceptedRequest = request;
for (Interceptor interceptor : interceptors) {
try {
interceptedRequest = interceptor.beforeRequest(interceptedRequest);
log.debug("Applied beforeRequest interceptor: {}", interceptor.getClass().getSimpleName());
}
catch (Exception e) {
log.error("Error in beforeRequest interceptor {}: {}",
interceptor.getClass().getSimpleName(), e.getMessage(), e);
}
}
return interceptedRequest;
}

protected Response applyAfterResponseInterceptors(Response response)
throws Exception
{
Response interceptedResponse = response;
for (Interceptor interceptor : interceptors) {
try {
interceptedResponse = interceptor.afterResponse(interceptedResponse);
log.debug("Applied afterResponse interceptor: {}", interceptor.getClass().getSimpleName());
}
catch (Exception e) {
log.error("Error in afterResponse interceptor {}: {}",
interceptor.getClass().getSimpleName(), e.getMessage(), e);
throw e;
}
}
return interceptedResponse;
}
}
132 changes: 12 additions & 120 deletions src/main/java/org/devlive/lightcall/processor/GetProcessor.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,24 @@
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.devlive.lightcall.RequestContext;
import org.devlive.lightcall.RequestException;
import org.devlive.lightcall.annotation.Get;
import org.devlive.lightcall.handler.ParameterHandler;
import org.devlive.lightcall.handler.ParameterHandlerFactory;
import org.devlive.lightcall.interceptor.Interceptor;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.List;

@Slf4j
public class GetProcessor
implements MethodProcessor<Get>
extends AbstractMethodProcessor<Get>
{
private final OkHttpClient client;
private final ObjectMapper objectMapper;
private final List<Interceptor> interceptors;
public static GetProcessor create(OkHttpClient client, ObjectMapper objectMapper, List<Interceptor> interceptors)
{
return new GetProcessor(client, objectMapper, interceptors);
}

public GetProcessor(OkHttpClient client, ObjectMapper objectMapper, List<Interceptor> interceptors)
private GetProcessor(OkHttpClient client, ObjectMapper objectMapper, List<Interceptor> interceptors)
{
this.client = client;
this.objectMapper = objectMapper;
this.interceptors = interceptors;
super(client, objectMapper, interceptors);
}

@Override
Expand All @@ -39,118 +32,17 @@ public Class<Get> getAnnotationType()
}

@Override
public Object process(Object proxy, Method method, Object[] args, Get annotation, RequestContext context)
throws Throwable
protected String getPath(Get annotation)
{
log.debug("Processing GET request for method: {}", method.getName());

HttpUrl url = buildUrl(annotation.value(), method, args, context);
return executeGet(url, method.getReturnType(), context);
return annotation.value();
}

private HttpUrl buildUrl(String path, Method method, Object[] args, RequestContext context)
{
// 原有的 buildUrl 逻辑
log.debug("Building URL for path: {}", path);

List<ParameterHandler> handlers = ParameterHandlerFactory.createHandlers(method, context);
Parameter[] parameters = method.getParameters();
String processedPath = path;

for (int i = 0; i < parameters.length; i++) {
Parameter parameter = parameters[i];
Object arg = args[i];

for (ParameterHandler handler : handlers) {
if (handler.canHandle(parameter)) {
processedPath = handler.handle(parameter, arg, processedPath);
break;
}
}
}

if (!processedPath.startsWith("/")) {
processedPath = "/" + processedPath;
}
context.getUrlBuilder().addPathSegments(processedPath.substring(1));

HttpUrl url = context.getUrlBuilder().build();
log.debug("Built URL: {}", url);
return url;
}

private <T> T executeGet(HttpUrl url, Class<T> returnType, RequestContext context)
throws Exception
@Override
protected Request buildRequest(HttpUrl url, RequestContext context)
{
log.info("Executing GET request - URL: {}, Expected return type: {}", url, returnType);

Request originalRequest = context.getRequestBuilder()
return context.getRequestBuilder()
.url(url)
.get()
.build();

Request request = applyBeforeRequestInterceptors(originalRequest);
log.info("Executing request - URL: {}, Headers: {}", request.url(), request.headers());

long startTime = System.currentTimeMillis();
try {
Response response = client.newCall(request).execute();
long duration = System.currentTimeMillis() - startTime;
log.debug("Received response in {}ms - Status code: {}", duration, response.code());

response = applyAfterResponseInterceptors(response);

if (!response.isSuccessful()) {
throw new RequestException("Request failed with code: " + response.code());
}

if (response.body() == null) {
log.warn("Response body is null for URL: {}", url);
return null;
}

String responseBody = response.body().string();
response.close();

return objectMapper.readValue(responseBody, returnType);
}
catch (Exception e) {
log.error("Error executing request: {}", e.getMessage(), e);
throw e;
}
}

private Request applyBeforeRequestInterceptors(Request request)
{
Request interceptedRequest = request;
for (Interceptor interceptor : interceptors) {
try {
interceptedRequest = interceptor.beforeRequest(interceptedRequest);
log.debug("Applied beforeRequest interceptor: {}", interceptor.getClass().getSimpleName());
}
catch (Exception e) {
log.error("Error in beforeRequest interceptor {}: {}",
interceptor.getClass().getSimpleName(), e.getMessage(), e);
}
}
return interceptedRequest;
}

private Response applyAfterResponseInterceptors(Response response)
throws Exception
{
Response interceptedResponse = response;
for (Interceptor interceptor : interceptors) {
try {
interceptedResponse = interceptor.afterResponse(interceptedResponse);
log.debug("Applied afterResponse interceptor: {}", interceptor.getClass().getSimpleName());
}
catch (Exception e) {
log.error("Error in afterResponse interceptor {}: {}",
interceptor.getClass().getSimpleName(), e.getMessage(), e);
throw e;
}
}
return interceptedResponse;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public LightCallProxy(LightCallConfig config)
this.processors = new HashMap<>();

// 注册默认的 GET 处理器
registerProcessor(new GetProcessor(client, objectMapper, config.getInterceptors()));
registerProcessor(GetProcessor.create(client, objectMapper, config.getInterceptors()));
}

public <A extends Annotation> void registerProcessor(MethodProcessor<A> processor)
Expand Down

0 comments on commit cebbc9e

Please sign in to comment.