All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy