001/*
002 * Copyright (c) 2011-2018 Nexmo Inc
003 *
004 * Permission is hereby granted, free of charge, to any person obtaining a copy
005 * of this software and associated documentation files (the "Software"), to deal
006 * in the Software without restriction, including without limitation the rights
007 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
008 * copies of the Software, and to permit persons to whom the Software is
009 * furnished to do so, subject to the following conditions:
010 *
011 * The above copyright notice and this permission notice shall be included in
012 * all copies or substantial portions of the Software.
013 *
014 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
015 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
016 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
017 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
018 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
019 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
020 * THE SOFTWARE.
021 */
022package com.nexmo.client;
023
024public class HttpConfig {
025    private static final String DEFAULT_API_BASE_URI = "https://api.nexmo.com";
026    private static final String DEFAULT_REST_BASE_URI = "https://rest.nexmo.com";
027    private static final String DEFAULT_SNS_BASE_URI = "https://sns.nexmo.com";
028
029    private String apiBaseUri;
030    private String restBaseUri;
031    private String snsBaseUri;
032
033    private HttpConfig(Builder builder) {
034        this.apiBaseUri = builder.apiBaseUri;
035        this.restBaseUri = builder.restBaseUri;
036        this.snsBaseUri = builder.snsBaseUri;
037    }
038
039    public String getApiBaseUri() {
040        return apiBaseUri;
041    }
042
043    public String getRestBaseUri() {
044        return restBaseUri;
045    }
046
047    public String getSnsBaseUri() {
048        return snsBaseUri;
049    }
050
051    public boolean isDefaultApiBaseUri() {
052        return DEFAULT_API_BASE_URI.equals(apiBaseUri);
053    }
054
055    public boolean isDefaultRestBaseUri() {
056        return DEFAULT_REST_BASE_URI.equals(restBaseUri);
057    }
058
059    public boolean isDefaultSnsBaseUri() {
060        return DEFAULT_SNS_BASE_URI.equals(snsBaseUri);
061    }
062
063    public String getVersionedApiBaseUri(String version) {
064        return appendVersionToUri(apiBaseUri, version);
065    }
066
067    public String getVersionedRestBaseUri(String version) {
068        return appendVersionToUri(restBaseUri, version);
069    }
070
071    public String getVersionedSnsBaseUri(String version) {
072        return appendVersionToUri(snsBaseUri, version);
073    }
074
075    private String appendVersionToUri(String uri, String version) {
076        return uri + "/" + version;
077    }
078
079    /**
080     * @return an HttpConfig object with sensible defaults.
081     */
082    public static HttpConfig defaultConfig() {
083        return new Builder().build();
084    }
085
086    public static Builder builder() {
087        return new Builder();
088    }
089
090    public static class Builder {
091        private String apiBaseUri;
092        private String restBaseUri;
093        private String snsBaseUri;
094
095        public Builder() {
096            this.apiBaseUri = DEFAULT_API_BASE_URI;
097            this.restBaseUri = DEFAULT_REST_BASE_URI;
098            this.snsBaseUri = DEFAULT_SNS_BASE_URI;
099        }
100
101        /**
102         * @param apiBaseUri The base uri to use in place of {@link HttpConfig#DEFAULT_API_BASE_URI}
103         *
104         * @return The {@link Builder} to keep building.
105         */
106        public Builder apiBaseUri(String apiBaseUri) {
107            this.apiBaseUri = sanitizeUri(apiBaseUri);
108            return this;
109        }
110
111        /**
112         * @param restBaseUri The base uri to use in place of {@link HttpConfig#DEFAULT_REST_BASE_URI}
113         *
114         * @return The {@link Builder} to keep building.
115         */
116        public Builder restBaseUri(String restBaseUri) {
117            this.restBaseUri = sanitizeUri(restBaseUri);
118            return this;
119        }
120
121        /**
122         * @param snsBaseUri The base uri to use in place of {@link HttpConfig#DEFAULT_SNS_BASE_URI}
123         *
124         * @return The {@link Builder} to keep building.
125         */
126        public Builder snsBaseUri(String snsBaseUri) {
127            this.snsBaseUri = sanitizeUri(snsBaseUri);
128            return this;
129        }
130
131        /**
132         * @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}
133         *
134         * @return The {@link Builder} to keep building.
135         */
136        public Builder baseUri(String baseUri) {
137            String sanitizedUri = sanitizeUri(baseUri);
138            this.apiBaseUri = sanitizedUri;
139            this.restBaseUri = sanitizedUri;
140            this.snsBaseUri = sanitizedUri;
141            return this;
142        }
143
144        /**
145         * @return A new {@link HttpConfig} object from the stored builder options.
146         */
147        public HttpConfig build() {
148            return new HttpConfig(this);
149        }
150
151        private String sanitizeUri(String uri) {
152            if (uri != null && uri.endsWith("/")) {
153                return uri.substring(0, uri.length() - 1);
154            }
155
156            return uri;
157        }
158    }
159}