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