001/*
002 *   Copyright 2020 Vonage
003 *
004 *   Licensed under the Apache License, Version 2.0 (the "License");
005 *   you may not use this file except in compliance with the License.
006 *   You may obtain a copy of the License at
007 *
008 *        http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *   Unless required by applicable law or agreed to in writing, software
011 *   distributed under the License is distributed on an "AS IS" BASIS,
012 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *   See the License for the specific language governing permissions and
014 *   limitations under the License.
015 */
016package com.vonage.client;
017
018public class HttpConfig {
019    private static final String DEFAULT_API_BASE_URI = "https://api.nexmo.com";
020    private static final String DEFAULT_REST_BASE_URI = "https://rest.nexmo.com";
021    private static final String DEFAULT_SNS_BASE_URI = "https://sns.nexmo.com";
022
023    private String apiBaseUri;
024    private String restBaseUri;
025    private String snsBaseUri;
026
027    private HttpConfig(Builder builder) {
028        this.apiBaseUri = builder.apiBaseUri;
029        this.restBaseUri = builder.restBaseUri;
030        this.snsBaseUri = builder.snsBaseUri;
031    }
032
033    public String getApiBaseUri() {
034        return apiBaseUri;
035    }
036
037    public String getRestBaseUri() {
038        return restBaseUri;
039    }
040
041    public String getSnsBaseUri() {
042        return snsBaseUri;
043    }
044
045    public boolean isDefaultApiBaseUri() {
046        return DEFAULT_API_BASE_URI.equals(apiBaseUri);
047    }
048
049    public boolean isDefaultRestBaseUri() {
050        return DEFAULT_REST_BASE_URI.equals(restBaseUri);
051    }
052
053    public boolean isDefaultSnsBaseUri() {
054        return DEFAULT_SNS_BASE_URI.equals(snsBaseUri);
055    }
056
057    public String getVersionedApiBaseUri(String version) {
058        return appendVersionToUri(apiBaseUri, version);
059    }
060
061    public String getVersionedRestBaseUri(String version) {
062        return appendVersionToUri(restBaseUri, version);
063    }
064
065    public String getVersionedSnsBaseUri(String version) {
066        return appendVersionToUri(snsBaseUri, version);
067    }
068
069    private String appendVersionToUri(String uri, String version) {
070        return uri + "/" + version;
071    }
072
073    /**
074     * @return an HttpConfig object with sensible defaults.
075     */
076    public static HttpConfig defaultConfig() {
077        return new Builder().build();
078    }
079
080    public static Builder builder() {
081        return new Builder();
082    }
083
084    public static class Builder {
085        private String apiBaseUri;
086        private String restBaseUri;
087        private String snsBaseUri;
088
089        public Builder() {
090            this.apiBaseUri = DEFAULT_API_BASE_URI;
091            this.restBaseUri = DEFAULT_REST_BASE_URI;
092            this.snsBaseUri = DEFAULT_SNS_BASE_URI;
093        }
094
095        /**
096         * @param apiBaseUri The base uri to use in place of {@link HttpConfig#DEFAULT_API_BASE_URI}
097         *
098         * @return The {@link Builder} to keep building.
099         */
100        public Builder apiBaseUri(String apiBaseUri) {
101            this.apiBaseUri = sanitizeUri(apiBaseUri);
102            return this;
103        }
104
105        /**
106         * @param restBaseUri The base uri to use in place of {@link HttpConfig#DEFAULT_REST_BASE_URI}
107         *
108         * @return The {@link Builder} to keep building.
109         */
110        public Builder restBaseUri(String restBaseUri) {
111            this.restBaseUri = sanitizeUri(restBaseUri);
112            return this;
113        }
114
115        /**
116         * @param snsBaseUri The base uri to use in place of {@link HttpConfig#DEFAULT_SNS_BASE_URI}
117         *
118         * @return The {@link Builder} to keep building.
119         */
120        public Builder snsBaseUri(String snsBaseUri) {
121            this.snsBaseUri = sanitizeUri(snsBaseUri);
122            return this;
123        }
124
125        /**
126         * @param baseUri The base uri to use in place of {@link HttpConfig#DEFAULT_REST_BASE_URI}, {@link HttpConfig#DEFAULT_API_BASE_URI}, and {@link HttpConfig#DEFAULT_SNS_BASE_URI}
127         *
128         * @return The {@link Builder} to keep building.
129         */
130        public Builder baseUri(String baseUri) {
131            String sanitizedUri = sanitizeUri(baseUri);
132            this.apiBaseUri = sanitizedUri;
133            this.restBaseUri = sanitizedUri;
134            this.snsBaseUri = sanitizedUri;
135            return this;
136        }
137
138        /**
139         * @return A new {@link HttpConfig} object from the stored builder options.
140         */
141        public HttpConfig build() {
142            return new HttpConfig(this);
143        }
144
145        private String sanitizeUri(String uri) {
146            if (uri != null && uri.endsWith("/")) {
147                return uri.substring(0, uri.length() - 1);
148            }
149
150            return uri;
151        }
152    }
153}