io.urmia.md.model.ObjectResponse.java Source code

Java tutorial

Introduction

Here is the source code for io.urmia.md.model.ObjectResponse.java

Source

package io.urmia.md.model;

/**
 *
 * Copyright 2014 by Amin Abbaspour
 *
 * This file is part of Urmia.io
 *
 * Urmia.io is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Urmia.io is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Urmia.io.  If not, see <http://www.gnu.org/licenses/>.
 */

import com.google.common.base.Joiner;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.DefaultFullHttpResponse;
import io.netty.handler.codec.http.FullHttpResponse;
import io.netty.handler.codec.http.HttpHeaders;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.CharsetUtil;
import io.urmia.md.model.storage.FullObjectName;

import java.util.List;

import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1;
import static io.urmia.util.StringUtils.isBlank;

public abstract class ObjectResponse {

    public String json() {
        return "";
    }

    public int resultSetSize() {
        return 0;
    }

    public String contentType() {
        return "application/x-json-stream; type=directory";
    }

    public final String toString() {
        return json();
    }

    public static final String RESULT_SET_SIZE = "result-set-size";

    // todo: need review
    public FullHttpResponse encode() {

        final HttpResponseStatus status;
        final ByteBuf content;

        if (this instanceof Failure) {
            status = ((Failure) this).type.status;
            content = Unpooled.copiedBuffer(json(), CharsetUtil.UTF_8);

        } else {
            final String json = this.json();

            if (isBlank(json)) {
                status = HttpResponseStatus.NO_CONTENT;
                content = Unpooled.EMPTY_BUFFER;
            } else {
                status = HttpResponseStatus.OK;
                content = Unpooled.copiedBuffer(json, CharsetUtil.UTF_8);
            }
        }

        FullHttpResponse httpResponse = new DefaultFullHttpResponse(HTTP_1_1, status, content);

        httpResponse.headers().set(HttpHeaders.Names.CONTENT_TYPE, this.contentType());
        //httpResponse.headers().set(HttpHeaders.Names.CONTENT_LENGTH, response.json().length());
        httpResponse.headers().set("transfer-encoding", "chunked"); // this is a must for list response

        if (this.resultSetSize() > 0)
            httpResponse.headers().set(RESULT_SET_SIZE, this.resultSetSize());

        return httpResponse;

    }

    public static class EmptyResponse extends ObjectResponse {

        @Override
        public String json() {
            return "";
        }

        public HttpResponseStatus status() {
            return HttpResponseStatus.NO_CONTENT;
        }

    }

    public static class SingleObject extends ObjectResponse {

        public final FullObjectName fullObjectName;

        public SingleObject(FullObjectName fullObjectName) {
            this.fullObjectName = fullObjectName;
        }

        @Override
        public String json() {
            return fullObjectName.toString();
        }
    }

    private static final Joiner LINE_JOINER = Joiner.on('\n').skipNulls();

    public static class MultipleObjects extends ObjectResponse {

        public final List<FullObjectName> objects;

        public MultipleObjects(List<FullObjectName> objects) {
            this.objects = objects;
        }

        @Override
        public String json() {
            return LINE_JOINER.join(objects);
        }

        @Override
        public int resultSetSize() {
            return objects.size();
        }
    }

    public static enum FailureType {
        NotFound("NotFoundError", HttpResponseStatus.NOT_FOUND), Timeout("TimeoutError",
                HttpResponseStatus.GATEWAY_TIMEOUT), Internal("InternalError",
                        HttpResponseStatus.BAD_GATEWAY), NotEmpty("DirectoryNotEmpty",
                                HttpResponseStatus.BAD_REQUEST);

        public final String code;
        public final HttpResponseStatus status;

        FailureType(String code, HttpResponseStatus status) {
            this.code = code;
            this.status = status;
        }
    }

    public static class Failure extends ObjectResponse {

        public final FailureType type;
        public final String message;

        public Failure(FailureType type, String message) {
            this.type = type;
            this.message = message;
        }

        @Override
        public String json() {
            return "{" + "\"code\":\"" + type.code + '\"' + ", \"message\":\"" + message + '\"' + '}';
        }

    }

}