001package org.xbib.elasticsearch.rest;
002
003import org.elasticsearch.ElasticsearchException;
004import org.elasticsearch.common.component.AbstractLifecycleComponent;
005import org.elasticsearch.common.inject.Inject;
006import org.elasticsearch.common.path.PathTrie;
007import org.elasticsearch.common.settings.Settings;
008import org.elasticsearch.rest.BytesRestResponse;
009import org.elasticsearch.rest.RestChannel;
010import org.elasticsearch.rest.RestHandler;
011import org.elasticsearch.rest.RestRequest;
012import org.elasticsearch.rest.support.RestUtils;
013import org.xbib.elasticsearch.http.netty.NettyHttpRequest;
014
015public class HttpPatchRestController extends AbstractLifecycleComponent<HttpPatchRestController> {
016
017    private final PathTrie<RestHandler> patchHandlers = new PathTrie<>(RestUtils.REST_DECODER);
018
019    @Inject
020    public HttpPatchRestController(Settings settings) {
021        super(settings);
022    }
023
024    @Override
025    protected void doStart() throws ElasticsearchException {
026
027    }
028
029    @Override
030    protected void doStop() throws ElasticsearchException {
031
032    }
033
034    @Override
035    protected void doClose() throws ElasticsearchException {
036
037    }
038
039    public void registerHandler(String method, String path, RestHandler handler) {
040        if ("PATCH".equalsIgnoreCase(method)) {
041            patchHandlers.insert(path, handler);
042        }
043    }
044
045    public void dispatchRequest(final RestRequest request, final RestChannel channel) {
046        try {
047            if (request instanceof NettyHttpRequest) {
048                NettyHttpRequest nettyHttpRequest = (NettyHttpRequest)request;
049                if ("PATCH".equalsIgnoreCase(nettyHttpRequest.getMethod())) {
050                    RestHandler handler = patchHandlers.retrieve(request.rawPath());
051                    if (handler != null) {
052                        handler.handleRequest(request, channel);
053                    }
054                }
055            }
056        } catch (Throwable e) {
057            try {
058                channel.sendResponse(new BytesRestResponse(channel, e));
059            } catch (Throwable e1) {
060                logger.error("failed to send failure response for uri [" + request.uri() + "]", e1);
061            }
062        }
063    }
064}