
com.github.yoojia.next.actions.NextAction Maven / Gradle / Ivy
package com.github.yoojia.next.actions;
import com.github.yoojia.next.NextChain;
import com.github.yoojia.next.NextRequest;
import com.github.yoojia.next.NextResponse;
import com.github.yoojia.next.supports.*;
import com.github.yoojia.next.utils.TimeAnalysis;
/**
* @author YOOJIA.CHEN (yoojia.chen@gmail.com)
*/
public final class NextAction extends AbstractModule {
private final static int DEFAULT_PRIORITY = 0;
private final ActionManager mManager = new ActionManager();
private final ImmutableObject mContext = new ImmutableObject<>();
private final ImmutableObject mForwardEnabled = new ImmutableObject<>();
private final ImmutableObject mDefaultStatus = new ImmutableObject<>();
@Override
public void init(Context context, Config config) {
mLogger.debug("Init...");
mContext.setOnce(context);
// Set module config
mForwardEnabled.setOnce(config == null ?
false : config.getValue("defaultForward", false));
/*
当HTTP Action有任意一个处理器接受请求后, Action则状态码设置为 202 Accepted 状态
*/
mDefaultStatus.setOnce(config == null ?
StatusCode.ACCEPTED : config.getValue("defaultStatus", StatusCode.ACCEPTED));
mLogger.trace("Using default forward: {}", mForwardEnabled);
final long start = System.nanoTime();
context.getClassClassFinder().walkClasses(new FilterScanner<>(Action.class, Handle.class, mManager));
TimeAnalysis.log(start, "NextAction.init");
}
@Override
public void onService(NextRequest request, NextResponse response, DispatchChain dispatchChain) throws Exception {
final long findStart = System.nanoTime();
final ActionProcessor processor = mManager.findMatched(request.method, request.resources);
if(processor != null){
TimeAnalysis.log(findStart, String.format("NextAction.find(:%s)", request.uri));
final long start = System.nanoTime();
response.setStatusCode(mDefaultStatus.get());
try{
final HttpActionChain chain = new HttpActionChain(mForwardEnabled.get());
request.putAllParams(processor.parseURI(request.resources));
processor.perform(mContext.get(), request, response, chain);
if( ! chain.isForwardEnabled()) {
return;
}
} finally {
TimeAnalysis.log(start, String.format("NextAction.processed(:%s)", request.uri));
}
}
dispatchChain.onService(request, response, dispatchChain);
}
@Override
public void onStartup(Context context) {
mManager.rebuild();
}
@Override
public void onShutdown(Context context) {
mManager.clear();
}
private static class HttpActionChain extends NextChain {
public HttpActionChain(boolean defaultForwardEnabled) {
super(defaultForwardEnabled);
}
@Override
public boolean isForwardEnabled() {
return super.isForwardEnabled();
}
}
@Override
public int getPriority() {
return DEFAULT_PRIORITY;
}
}