001 package com.nimbusds.jose;
002
003
004 import net.minidev.json.JSONAware;
005 import net.minidev.json.JSONObject;
006
007 import net.jcip.annotations.Immutable;
008
009
010 /**
011 * The base class for algorithm names, with optional implementation
012 * requirement. This class is immutable.
013 *
014 * <p>Includes constants for the following standard algorithm names:
015 *
016 * <ul>
017 * <li>{@link #NONE none}
018 * </ul>
019 *
020 * @author Vladimir Dzhuvinov
021 * @version $version$ (2013-01-15)
022 */
023 @Immutable
024 public class Algorithm implements JSONAware {
025
026
027 /**
028 * No algorithm (plain JOSE object without signature / encryption).
029 */
030 public static final Algorithm NONE = new Algorithm("none", Requirement.REQUIRED);
031
032
033 /**
034 * The algorithm name.
035 */
036 private final String name;
037
038
039 /**
040 * The implementation requirement, {@code null} if not known.
041 */
042 private final Requirement requirement;
043
044
045 /**
046 * Creates a new JOSE algorithm name.
047 *
048 * @param name The algorithm name. Must not be {@code null}.
049 * @param req The implementation requirement, {@code null} if not
050 * known.
051 */
052 public Algorithm(final String name, final Requirement req) {
053
054 if (name == null)
055 throw new IllegalArgumentException("The algorithm name must not be null");
056
057 this.name = name;
058
059 requirement = req;
060 }
061
062
063 /**
064 * Creates a new JOSE algorithm name.
065 *
066 * @param name The algorithm name. Must not be {@code null}.
067 */
068 public Algorithm(final String name) {
069
070 this(name, null);
071 }
072
073
074 /**
075 * Gets the name of this algorithm.
076 *
077 * @return The algorithm name.
078 */
079 public String getName() {
080
081 return name;
082 }
083
084
085 /**
086 * Gets the implementation requirement of this algorithm.
087 *
088 * @return The implementation requirement, {@code null} if not known.
089 */
090 public Requirement getRequirement() {
091
092 return requirement;
093 }
094
095
096 /**
097 * Overrides {@code Object.hashCode()}.
098 *
099 * @return The object hash code.
100 */
101 @Override
102 public int hashCode() {
103
104 return name.hashCode();
105 }
106
107
108 /**
109 * Overrides {@code Object.equals()}.
110 *
111 * @param object The object to compare to.
112 *
113 * @return {@code true} if the objects have the same value, otherwise
114 * {@code false}.
115 */
116 @Override
117 public boolean equals(final Object object) {
118
119 return object != null &&
120 object instanceof Algorithm &&
121 this.toString().equals(object.toString());
122 }
123
124
125 /**
126 * Returns the string representation of this algorithm.
127 *
128 * @see #getName
129 *
130 * @return The string representation.
131 */
132 @Override
133 public String toString() {
134
135 return name;
136 }
137
138
139 /**
140 * Returns the JSON string representation of this algorithm.
141 *
142 * @return The JSON string representation.
143 */
144 @Override
145 public String toJSONString() {
146
147 StringBuilder sb = new StringBuilder();
148 sb.append('"');
149 sb.append(JSONObject.escape(name));
150 sb.append('"');
151 return sb.toString();
152 }
153 }