4040import com .google .firebase .remoteconfig .internal .RemoteConfigServiceErrorResponse ;
4141import com .google .firebase .remoteconfig .internal .ServerTemplateResponse ;
4242import com .google .firebase .remoteconfig .internal .TemplateResponse ;
43+
4344import java .io .IOException ;
4445import java .util .List ;
4546import java .util .Map ;
4647
47- /** A helper class for interacting with Firebase Remote Config service. */
48+ /**
49+ * A helper class for interacting with Firebase Remote Config service.
50+ */
4851final class FirebaseRemoteConfigClientImpl implements FirebaseRemoteConfigClient {
4952
50- private static final String REMOTE_CONFIG_URL =
51- "https://firebaseremoteconfig.googleapis.com/v1/projects/%s/remoteConfig" ;
53+ private static final String REMOTE_CONFIG_URL = "https://firebaseremoteconfig.googleapis.com/v1/projects/%s/remoteConfig" ;
5254
5355 private static final String SERVER_REMOTE_CONFIG_URL =
5456 "https://firebaseremoteconfig.googleapis.com/v1/projects/%s/namespaces/firebase-server/serverRemoteConfig" ;
5557
5658 private static final Map <String , String > COMMON_HEADERS =
57- ImmutableMap .of (
58- "X-Firebase-Client" ,
59- "fire-admin-java/" + SdkUtils .getVersion (),
60- // There is a known issue in which the ETag is not properly returned in cases
61- // where the request does not specify a compression type. Currently, it is
62- // required to include the header `Accept-Encoding: gzip` or equivalent in all
63- // requests.
64- // https://firebase.google.com/docs/remote-config/use-config-rest#etag_usage_and_forced_updates
65- "Accept-Encoding" ,
66- "gzip" );
59+ ImmutableMap .of (
60+ "X-Firebase-Client" , "fire-admin-java/" + SdkUtils .getVersion (),
61+ // There is a known issue in which the ETag is not properly returned in cases
62+ // where the request does not specify a compression type. Currently, it is
63+ // required to include the header `Accept-Encoding: gzip` or equivalent in all
64+ // requests. https://firebase.google.com/docs/remote-config/use-config-rest#etag_usage_and_forced_updates
65+ "Accept-Encoding" , "gzip"
66+ );
6767
6868 private final String remoteConfigUrl ;
6969 private final String serverRemoteConfigUrl ;
@@ -79,8 +79,7 @@ private FirebaseRemoteConfigClientImpl(Builder builder) {
7979 this .jsonFactory = checkNotNull (builder .jsonFactory );
8080 HttpResponseInterceptor responseInterceptor = builder .responseInterceptor ;
8181 RemoteConfigErrorHandler errorHandler = new RemoteConfigErrorHandler (this .jsonFactory );
82- this .httpClient =
83- new ErrorHandlingHttpClient <>(requestFactory , jsonFactory , errorHandler )
82+ this .httpClient = new ErrorHandlingHttpClient <>(requestFactory , jsonFactory , errorHandler )
8483 .setInterceptor (responseInterceptor );
8584 }
8685
@@ -106,8 +105,8 @@ JsonFactory getJsonFactory() {
106105
107106 @ Override
108107 public Template getTemplate () throws FirebaseRemoteConfigException {
109- HttpRequestInfo request =
110- HttpRequestInfo . buildGetRequest ( remoteConfigUrl ) .addAllHeaders (COMMON_HEADERS );
108+ HttpRequestInfo request = HttpRequestInfo . buildGetRequest ( remoteConfigUrl )
109+ .addAllHeaders (COMMON_HEADERS );
111110 IncomingHttpResponse response = httpClient .send (request );
112111 TemplateResponse templateResponse = httpClient .parse (response , TemplateResponse .class );
113112 Template template = new Template (templateResponse );
@@ -127,13 +126,11 @@ public String getServerTemplate() throws FirebaseRemoteConfigException {
127126 }
128127
129128 @ Override
130- public Template getTemplateAtVersion (@ NonNull String versionNumber )
131- throws FirebaseRemoteConfigException {
132- checkArgument (
133- RemoteConfigUtil .isValidVersionNumber (versionNumber ),
134- "Version number must be a non-empty string in int64 format." );
135- HttpRequestInfo request =
136- HttpRequestInfo .buildGetRequest (remoteConfigUrl )
129+ public Template getTemplateAtVersion (
130+ @ NonNull String versionNumber ) throws FirebaseRemoteConfigException {
131+ checkArgument (RemoteConfigUtil .isValidVersionNumber (versionNumber ),
132+ "Version number must be a non-empty string in int64 format." );
133+ HttpRequestInfo request = HttpRequestInfo .buildGetRequest (remoteConfigUrl )
137134 .addAllHeaders (COMMON_HEADERS )
138135 .addParameter ("versionNumber" , versionNumber );
139136 IncomingHttpResponse response = httpClient .send (request );
@@ -143,15 +140,11 @@ public Template getTemplateAtVersion(@NonNull String versionNumber)
143140 }
144141
145142 @ Override
146- public Template publishTemplate (
147- @ NonNull Template template , boolean validateOnly , boolean forcePublish )
148- throws FirebaseRemoteConfigException {
143+ public Template publishTemplate (@ NonNull Template template , boolean validateOnly ,
144+ boolean forcePublish ) throws FirebaseRemoteConfigException {
149145 checkArgument (template != null , "Template must not be null." );
150- HttpRequestInfo request =
151- HttpRequestInfo .buildRequest (
152- "PUT" ,
153- remoteConfigUrl ,
154- new JsonHttpContent (jsonFactory , template .toTemplateResponse (false )))
146+ HttpRequestInfo request = HttpRequestInfo .buildRequest ("PUT" , remoteConfigUrl ,
147+ new JsonHttpContent (jsonFactory , template .toTemplateResponse (false )))
155148 .addAllHeaders (COMMON_HEADERS )
156149 .addHeader ("If-Match" , forcePublish ? "*" : template .getETag ());
157150 if (validateOnly ) {
@@ -171,12 +164,11 @@ public Template publishTemplate(
171164
172165 @ Override
173166 public Template rollback (@ NonNull String versionNumber ) throws FirebaseRemoteConfigException {
174- checkArgument (
175- RemoteConfigUtil .isValidVersionNumber (versionNumber ),
176- "Version number must be a non-empty string in int64 format." );
167+ checkArgument (RemoteConfigUtil .isValidVersionNumber (versionNumber ),
168+ "Version number must be a non-empty string in int64 format." );
177169 Map <String , String > content = ImmutableMap .of ("versionNumber" , versionNumber );
178- HttpRequestInfo request =
179- HttpRequestInfo .buildJsonPostRequest (remoteConfigUrl + ":rollback" , content )
170+ HttpRequestInfo request = HttpRequestInfo
171+ .buildJsonPostRequest (remoteConfigUrl + ":rollback" , content )
180172 .addAllHeaders (COMMON_HEADERS );
181173 IncomingHttpResponse response = httpClient .send (request );
182174 TemplateResponse templateResponse = httpClient .parse (response , TemplateResponse .class );
@@ -185,10 +177,9 @@ public Template rollback(@NonNull String versionNumber) throws FirebaseRemoteCon
185177 }
186178
187179 @ Override
188- public TemplateResponse .ListVersionsResponse listVersions (ListVersionsOptions options )
189- throws FirebaseRemoteConfigException {
190- HttpRequestInfo request =
191- HttpRequestInfo .buildGetRequest (remoteConfigUrl + ":listVersions" )
180+ public TemplateResponse .ListVersionsResponse listVersions (
181+ ListVersionsOptions options ) throws FirebaseRemoteConfigException {
182+ HttpRequestInfo request = HttpRequestInfo .buildGetRequest (remoteConfigUrl + ":listVersions" )
192183 .addAllHeaders (COMMON_HEADERS );
193184 if (options != null ) {
194185 request .addAllParameters (options .wrapForTransport ());
@@ -198,30 +189,27 @@ public TemplateResponse.ListVersionsResponse listVersions(ListVersionsOptions op
198189
199190 private String getETag (IncomingHttpResponse response ) {
200191 List <String > etagList = (List <String >) response .getHeaders ().get ("etag" );
201- checkState (
202- etagList != null && !etagList .isEmpty (),
203- "ETag header is not available in the server response." );
204-
192+ checkState (etagList != null && !etagList .isEmpty (),
193+ "ETag header is not available in the server response." );
205194 String etag = etagList .get (0 );
206- checkState (
207- ! Strings . isNullOrEmpty ( etag ), "ETag header is not available in the server response." );
195+ checkState (! Strings . isNullOrEmpty ( etag ),
196+ "ETag header is not available in the server response." );
208197
209198 return etag ;
210199 }
211200
212201 static FirebaseRemoteConfigClientImpl fromApp (FirebaseApp app ) {
213202 String projectId = ImplFirebaseTrampolines .getProjectId (app );
214- checkArgument (
215- !Strings .isNullOrEmpty (projectId ),
216- "Project ID is required to access Remote Config service. Use a service "
217- + "account credential or set the project ID explicitly via FirebaseOptions. "
218- + "Alternatively you can also set the project ID via the GOOGLE_CLOUD_PROJECT "
219- + "environment variable." );
203+ checkArgument (!Strings .isNullOrEmpty (projectId ),
204+ "Project ID is required to access Remote Config service. Use a service "
205+ + "account credential or set the project ID explicitly via FirebaseOptions. "
206+ + "Alternatively you can also set the project ID via the GOOGLE_CLOUD_PROJECT "
207+ + "environment variable." );
220208 return FirebaseRemoteConfigClientImpl .builder ()
221- .setProjectId (projectId )
222- .setRequestFactory (ApiClientUtils .newAuthorizedRequestFactory (app ))
223- .setJsonFactory (app .getOptions ().getJsonFactory ())
224- .build ();
209+ .setProjectId (projectId )
210+ .setRequestFactory (ApiClientUtils .newAuthorizedRequestFactory (app ))
211+ .setJsonFactory (app .getOptions ().getJsonFactory ())
212+ .build ();
225213 }
226214
227215 static Builder builder () {
@@ -235,7 +223,7 @@ static final class Builder {
235223 private JsonFactory jsonFactory ;
236224 private HttpResponseInterceptor responseInterceptor ;
237225
238- private Builder () {}
226+ private Builder () { }
239227
240228 Builder setProjectId (String projectId ) {
241229 this .projectId = projectId ;
@@ -252,7 +240,8 @@ Builder setJsonFactory(JsonFactory jsonFactory) {
252240 return this ;
253241 }
254242
255- Builder setResponseInterceptor (HttpResponseInterceptor responseInterceptor ) {
243+ Builder setResponseInterceptor (
244+ HttpResponseInterceptor responseInterceptor ) {
256245 this .responseInterceptor = responseInterceptor ;
257246 return this ;
258247 }
@@ -263,7 +252,7 @@ FirebaseRemoteConfigClientImpl build() {
263252 }
264253
265254 private static class RemoteConfigErrorHandler
266- extends AbstractPlatformErrorHandler <FirebaseRemoteConfigException > {
255+ extends AbstractPlatformErrorHandler <FirebaseRemoteConfigException > {
267256
268257 private RemoteConfigErrorHandler (JsonFactory jsonFactory ) {
269258 super (jsonFactory );
@@ -274,7 +263,7 @@ protected FirebaseRemoteConfigException createException(FirebaseException base)
274263 String response = getResponse (base );
275264 RemoteConfigServiceErrorResponse parsed = safeParse (response );
276265 return FirebaseRemoteConfigException .withRemoteConfigErrorCode (
277- base , parsed .getRemoteConfigErrorCode ());
266+ base , parsed .getRemoteConfigErrorCode ());
278267 }
279268
280269 private String getResponse (FirebaseException base ) {
@@ -288,9 +277,8 @@ private String getResponse(FirebaseException base) {
288277 private RemoteConfigServiceErrorResponse safeParse (String response ) {
289278 if (!Strings .isNullOrEmpty (response )) {
290279 try {
291- return jsonFactory
292- .createJsonParser (response )
293- .parseAndClose (RemoteConfigServiceErrorResponse .class );
280+ return jsonFactory .createJsonParser (response )
281+ .parseAndClose (RemoteConfigServiceErrorResponse .class );
294282 } catch (IOException ignore ) {
295283 // Ignore any error that may occur while parsing the error response. The server
296284 // may have responded with a non-json payload.
0 commit comments