View Javadoc
1   /*
2    * The contents of this file are subject to the terms of the Common Development and
3    * Distribution License (the License). You may not use this file except in compliance with the
4    * License.
5    *
6    * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
7    * specific language governing permission and limitations under the License.
8    *
9    * When distributing Covered Software, include this CDDL Header Notice in each file and include
10   * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
11   * Header, with the fields enclosed by brackets [] replaced by your own identifying
12   * information: "Portions copyright [year] [name of copyright owner]".
13   *
14   * Copyright 2013-2016 ForgeRock AS.
15   */
16  
17  package org.forgerock.json.jose.jwt;
18  
19  import java.util.Collections;
20  import java.util.HashMap;
21  import java.util.Locale;
22  import java.util.Map;
23  
24  /**
25   * An Enum for the JWT Header parameter names.
26   * <p>
27   * As described in the JWT specification, the reserved JWT header parameters are listed,
28   * <ul>
29   *     <li>"typ"</li>
30   *     <li>"alg"</li>
31   * </ul>
32   * Any other header parameter name is deemed as a "custom" header parameter.
33   *
34   * @since 2.0.0
35   */
36  public enum JwtHeaderKey {
37  
38      /** Type JWT header parameter.. */
39      TYP,
40      /** Algorithm JWT header parameter. */
41      ALG,
42      /** Generic header key for a custom header parameter. */
43      CUSTOM;
44  
45      /**
46       * Read-only {@code Map} of {@code JwtHeaderKey} values as lower-case {@code String}s, for fast lookup.
47       */
48      private static final Map<String, JwtHeaderKey> NAME_MAP;
49  
50      static {
51          final Map<String, JwtHeaderKey> temp = new HashMap<>();
52          for (final JwtHeaderKey key : values()) {
53              temp.put(key.lowerCaseName, key);
54          }
55          NAME_MAP = Collections.unmodifiableMap(temp);
56      }
57  
58      private final String lowerCaseName;
59  
60      /**
61       * Creates a {@code JwtHeaderKey} with pre-allocated lower-case {@code String} representation, as a
62       * performance optimization, because this {@code enum} is often converted to a {@code String}.
63       */
64      JwtHeaderKey() {
65          this.lowerCaseName = name().toLowerCase(Locale.ROOT);
66      }
67  
68      /**
69       * Returns a lowercase String of the JwtHeaderKey constant.
70       *
71       * @return Lowercase String representation of the constant.
72       * @see #toString()
73       */
74      public String value() {
75          return toString();
76      }
77  
78      /**
79       * Gets the JwtHeaderKey constant that matches the given String.
80       * <p>
81       * If the given String does not match any of the constants, then CUSTOM is returned.
82       *
83       * @param headerKey The String representation of a JwtHeaderKey.
84       * @return The matching JwtHeaderKey.
85       */
86      public static JwtHeaderKey getHeaderKey(final String headerKey) {
87          if (headerKey != null && !headerKey.isEmpty()) {
88              final JwtHeaderKey value = NAME_MAP.get(headerKey.toLowerCase(Locale.ROOT));
89              if (value != null) {
90                  return value;
91              }
92          }
93          return CUSTOM;
94      }
95  
96      /**
97       * Turns the JwtHeaderKey constant into a lowercase String.
98       *
99       * @return Lowercase String representation of the constant.
100      */
101     @Override
102     public String toString() {
103         return lowerCaseName;
104     }
105 }