xref: /aosp_15_r20/external/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/rpc/FixedHeaderProvider.java (revision 882aa7c72c3cd3b66e72a261bdd69b93f7de7670)
1 /*
2  * Copyright 2017 Google LLC
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  *     * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *     * Redistributions in binary form must reproduce the above
11  * copyright notice, this list of conditions and the following disclaimer
12  * in the documentation and/or other materials provided with the
13  * distribution.
14  *     * Neither the name of Google LLC nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 package com.google.api.gax.rpc;
31 
32 import com.google.auto.value.AutoValue;
33 import com.google.common.collect.ImmutableMap;
34 import java.io.Serializable;
35 import java.util.Collection;
36 import java.util.HashSet;
37 import java.util.Map;
38 import java.util.Set;
39 import javax.annotation.Nullable;
40 
41 /** An instance of HeaderProvider that always provides the same headers. */
42 @AutoValue
43 public abstract class FixedHeaderProvider implements HeaderProvider, Serializable {
44 
45   private static final long serialVersionUID = -4881534091594970538L;
46 
47   @Override
48   @Nullable
getHeaders()49   public abstract Map<String, String> getHeaders();
50 
51   /** Creates a FixedHeaderProvider. */
create(Map<String, String> headers)52   public static FixedHeaderProvider create(Map<String, String> headers) {
53     checkKeys(headers.keySet());
54     return new AutoValue_FixedHeaderProvider(ImmutableMap.copyOf(headers));
55   }
56 
create(String... keyValuePairs)57   public static FixedHeaderProvider create(String... keyValuePairs) {
58     if (keyValuePairs.length % 2 != 0) {
59       throw new IllegalArgumentException(
60           "The keyValuePairs var-arg parameter must contain an even number of elements");
61     }
62     ImmutableMap.Builder<String, String> headersBuilder = ImmutableMap.builder();
63     for (int i = 0; i < keyValuePairs.length; i += 2) {
64       headersBuilder.put(keyValuePairs[i], keyValuePairs[i + 1]);
65     }
66     Map<String, String> headers = headersBuilder.build();
67 
68     checkKeys(headers.keySet());
69     return new AutoValue_FixedHeaderProvider(headers);
70   }
71 
checkKeys(Collection<String> keys)72   private static void checkKeys(Collection<String> keys) {
73     Set<String> caseInsensitiveKeys = new HashSet<>();
74     for (String key : keys) {
75       if (!caseInsensitiveKeys.add(key.toLowerCase())) {
76         throw new IllegalArgumentException(
77             "The header key '" + key + "' is not case insensitively unique");
78       }
79     }
80   }
81 }
82