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

com.bebound.spring.model.Request Maven / Gradle / Ivy

The newest version!
package com.bebound.spring.model;

import com.bebound.spring.utils.C;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by mbiamont on 11/12/2015.
 */
public abstract class Request {

    @SerializedName(C.Parameter.PARAM_TRANSPORT)
    private String transport;

    @SerializedName(C.Parameter.PARAM_USER_ID)
    private long userId;

    @SerializedName(C.Parameter.PARAM_PHONE_NUMBER)
    private String phoneNumber;

    @SerializedName(C.Parameter.PARAM_APP_ID)
    private long appId;

    @SerializedName(C.Parameter.PARAM_APP_NAME)
    private String appName;

    @SerializedName(C.Parameter.PARAM_APP_VERSION)
    private long appVersion;

    @SerializedName(C.Parameter.PARAM_OPERATION_NAME)
    private String operationName;

    public Request() {
    }

    public abstract Map getParameters();

    public abstract void setParameters(Map parameters);

    public abstract  T getBodyAs(Class type);

    public String getTransport() {
        return transport;
    }

    public void setTransport(String transport) {
        this.transport = transport;
    }

    public long getUserId() {
        return userId;
    }

    public void setUserId(long userId) {
        this.userId = userId;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public long getAppId() {
        return appId;
    }

    public void setAppId(long appId) {
        this.appId = appId;
    }

    public String getAppName() {
        return appName;
    }

    public void setAppName(String appName) {
        this.appName = appName;
    }

    public long getAppVersion() {
        return appVersion;
    }

    public void setAppVersion(long appVersion) {
        this.appVersion = appVersion;
    }

    public String getOperationName() {
        return operationName;
    }

    public void setOperationName(String operationName) {
        this.operationName = operationName;
    }

    public boolean isSmsRequest() {
        return transport.equalsIgnoreCase("sms");
    }

    public boolean isWebRequest() {
        return transport.equalsIgnoreCase("web");
    }

    public static class MapRequest extends Request {
        @SerializedName(C.Parameter.PARAM_PARAMETER_LIST)
        private Map parameters;

        @Expose(serialize = false, deserialize = false)
        private String jsonParams;

        public Map getParameters() {
            return parameters;
        }

        public void setParameters(Map parameters) {
            this.parameters = parameters;
        }

        @Override
        public  T getBodyAs(Class type) {
            return new GsonBuilder().create().fromJson(jsonParams, type);
        }

        public String getJsonParams() {
            return jsonParams;
        }

        public void setJsonParams(String json) {
            this.jsonParams = json;
        }
    }

    public static class BodyRequest extends Request {
        @SerializedName(C.Parameter.PARAM_PARAMETER_LIST)
        private T body;

        public T getBody() {
            return body;
        }

        public void setBody(T body) {
            this.body = body;
        }

        @Override
        public Map getParameters() {
            throw new UnsupportedOperationException();
        }

        @Override
        public void setParameters(Map parameters) {
            throw new UnsupportedOperationException();
        }

        @Override
        public  T getBodyAs(Class type) {
            throw new UnsupportedOperationException();
        }
    }

    public static class Builder {
        private String transport;
        private long   userId;
        private String phoneNumber;
        private long   appId;
        private String appName;
        private long   appVersion;
        private String operationName;

        private Object body;
        private Map parameters = new HashMap<>();

        public Builder withTransport(String transport) {
            this.transport = transport;
            return this;
        }

        public Builder withUserId(long userId) {
            this.userId = userId;
            return this;
        }

        public Builder withPhoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
            return this;
        }

        public Builder withAppId(long appId) {
            this.appId = appId;
            return this;
        }

        public Builder withAppName(String appName) {
            this.appName = appName;
            return this;
        }

        public Builder withAppVersion(long appVersion) {
            this.appVersion = appVersion;
            return this;
        }

        public Builder withOperationName(String operationName) {
            this.operationName = operationName;
            return this;
        }

        public Builder put(String name, Object value) {
            parameters.put(name, value);
            return this;
        }

        public Builder withBody(Object body) {
            this.body = body;
            return this;
        }

        public Request build() {
            Request request;

            if (body != null) {
                BodyRequest bodyRequest = new BodyRequest<>();
                bodyRequest.setBody(body);
                request = bodyRequest;
            } else {
                MapRequest mapRequest = new MapRequest();
                mapRequest.setParameters(parameters);
                request = mapRequest;
            }

            request.setUserId(userId);
            request.setPhoneNumber(phoneNumber);
            request.setAppVersion(appVersion);
            request.setAppId(appId);
            request.setAppName(appName);
            request.setOperationName(operationName);
            request.setTransport(transport);

            return request;
        }
    }
}